我有一个 Pandas dataframe 显示人们在 1 月和 2 月花了多少钱。我想使用 groupby 函数按人对月份进行分组,但我的代码生成的是 DataFrameGroupBy 对象 而不是实际的数据框。我还有一个性别列,我想保留它。
代码:
import pandas as pd
df = pd.DataFrame(data=[['Person A', 5, 21, 'Male'], ['Person B', 15, 3, 'Female']], columns=['Names', 'Jan', 'Feb', 'Gender'])
print df.groupby(['Names', 'Jan', 'Feb'])
输出:
<pandas.core.groupby.DataFrameGroupBy object at 0x020D4470>
起始数据框:
Names Jan Feb Gender
0 Person A 5 21 Male
1 Person B 15 3 Female
期望的输出:
Names Value Gender
0 Person A - Jan 5 Male
1 Person A - Feb 21 Male
2 Person B - Jan 15 Female
3 Person B - Feb 3 Female
请您参考如下方法:
您可以使用 melt与 sort_values , 然后连接列和最后一个 drop列变量:
df1 = pd.melt(df, id_vars='Names').sort_values('Names')
df1['Names'] = df1['Names'] + '- ' + df1['variable']
df1 = df1.drop('variable', axis=1)
print df1
Names value
0 Person A- Jan 5
2 Person A- Feb 21
1 Person B- Jan 15
3 Person B- Feb 3
另一种单线解决方案 assign :
print pd.melt(df, id_vars='Names').sort_values('Names')
.assign(Names = lambda x: x['Names'] + '- ' + x['variable'])
.drop('variable', axis=1)
Names value
0 Person A- Jan 5
2 Person A- Feb 21
1 Person B- Jan 15
3 Person B- Feb 3
编辑:
您可以向参数 id_vars 添加新列:
df1 = pd.melt(df, id_vars=['Names', 'Gender']).sort_values('Names')
df1['Names'] = df1['Names'] + '- ' + df1['variable']
df1 = df1.drop('variable', axis=1)
df1 = df1[['Names','value','Gender']]
print df1
Names value Gender
0 Person A- Jan 5 Male
2 Person A- Feb 21 Male
1 Person B- Jan 15 Female
3 Person B- Feb 3 Female
一行解决方案,如果您需要重新排序列,请使用 reindex_axis :
print pd.melt(df, id_vars=['Names', 'Gender'])
.sort_values('Names')
.assign(Names = lambda x: x['Names'] + '- ' + x['variable'])
.drop('variable', axis=1)
.reindex_axis(['Names','value','Gender'], axis=1)
Names value Gender
0 Person A- Jan 5 Male
2 Person A- Feb 21 Male
1 Person B- Jan 15 Female
3 Person B- Feb 3 Female
