Pandas按组分组后产生的是一个Series而不是GroupBy对象。

3

I have a Pandas DataFrame of transactions:

transactions.head():

   Amount      Date of Transaction   Description  \
0   39.95      2017-03-30            Fake_Transaction_One   
1    2.39      2017-04-01            Fake_Transaction_Two      
2    8.03      2017-04-01            Fake_Transaction_Three      
3   34.31      2017-04-01            Fake_Transaction_Four    
4   10.56      2017-04-03            Fake_Transaction_Five     

       Purchase_Type        year_month  
0      Miscellaneous        2017-03  
1      tool_expense         2017-04  
2      food_and_domestic    2017-04  
3      food_and_domestic    2017-04  
4      food_and_domestic    2017-04  

我在这个DataFrame上运行了一个groupby命令:

grouped_transactions = transactions.groupby(['Purchase_Type','year_month'])['Amount'].sum()

这会生成一个分组对象:

Purchase_Type        year_month
tool_expense         2017-04       72.49
Calendar_Event       2017-08        3.94
                     2017-12       23.92
                     2018-02       42.91
                     2018-03       10.91

我希望对此进行groupby命令,例如

grouped_transactions.groups.keys()

然而,我无法如此操作,因为该对象不是一个分组对象,而是一个系列对象:
In: type(grouped_transactions)
Out: pandas.core.series.Series

看起来,grouped_transactions 是一个 groupby 对象,而不是 Series。此外,它是通过在 Pandas DataFrame 上运行 .groupby 方法创建的。因此,我不确定为什么它是一个 Series。

我的理解或方法有什么错误?


如果想要使用groupby对象,需要g = transactions.groupby(['Purchase_Type','year_month'])['Amount'],但是使用groupby对象的原因是什么?期望的输出是什么? - jezrael
如果你想要groupby对象,为什么立即在它后面加上['Amount'].sum()?这样你就把你想要的对象丢掉了。 - John Zwinck
3个回答

5

如果方法被链接起来,例如groupby和聚合函数,那么得到的预期行为是SeriesDataFrame

如果需要groupby对象:

g = transactions.groupby(['Purchase_Type','year_month'])
print (g)
<pandas.core.groupby.groupby.DataFrameGroupBy object at 0x00000000191EA5C0>

如果您需要将聚合创建的MultiIndex转换为列:

df = transactions.groupby(['Purchase_Type','year_month'], as_index=False)['Amount'].sum()

或者:

df = transactions.groupby(['Purchase_Type','year_month'])['Amount'].sum().reset_index()

print (df)
       Purchase_Type year_month  Amount
0      Miscellaneous    2017-03   39.95
1  food_and_domestic    2017-04   52.90
2       tool_expense    2017-04    2.39

2

groupby 对象进行索引或调用聚合方法会将其转换为 seriesdataframe 类型对象。最佳实践:如果您需要键以及聚合,请将您的 GroupBy 对象分配给一个变量,然后在该对象上执行多个操作。

以下是一些示例。

df = pd.DataFrame([['A', 'B', 1], ['A', 'B', 2], ['A', 'C', 3]])

g = df.groupby([0, 1])
# <pandas.core.groupby.groupby.DataFrameGroupBy object at 0x0000000007E76AC8>

keys = g.groups.keys()
# dict_keys([('A', 'B'), ('A', 'C')])

sums_df = g.sum()
# <class 'pandas.core.frame.DataFrame'>

sums_series_group = g[2]
# <class 'pandas.core.groupby.groupby.SeriesGroupBy'>

sums_series = g[2].sum()
# <class 'pandas.core.series.Series'>

0

使用这个:

grouped_transactions = transactions.groupby(['Purchase_Type','year_month'])[['Amount']].sum()

如果您使用双方括号,则会创建一个列表,并将其作为参数传递给DataFrame索引函数。

这与制作系列的问题有何关联?你能详细说明一下吗? - StupidWolf
因为我认为他使用了单括号,因此grouped_transactions是Series而不是Dataframe。如果我错了,请纠正我,我刚开始学习。谢谢。 - Real1Minshen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接