Skip to main content
 首页 » 编程设计

python之Pandas 中的 Groupby 产生 Groupby Object 而不是 Dataframe

2025年05月04日32虾米哥

我有一个 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