我有一个交易的Pandas DataFrame:
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()
哪个会生成一个groupby对象:
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()
但是我不能,因为该对象不是groupby对象,而是一个Series:
In: type(grouped_transactions)
Out: pandas.core.series.Series
查看grouped_transactions似乎是一个groupby对象,而不是Series。进一步创建它,但是在Pandas DataFrame上运行.groupby方法。因此,我不确定为什么它是系列。
我的理解或方法上有什么错误?
答案 0 :(得分:3)
预期的行为(如果方法像-1.0
与聚合函数链接在一起)会得到groupby
或Series
。
如果您需要DataFrame
对象:
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()
答案 1 :(得分:2)
索引groupby
对象或对其调用聚合方法会将其转换为series
或dataframe
类型的对象。最佳做法:如果既需要键又需要聚合,则将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'>
答案 2 :(得分:0)
使用此:
grouped_transactions = transactions.groupby(['Purchase_Type','year_month'])[['Amount']].sum()
如果使用双括号,将创建一个列表,并将其作为参数传递给DataFrame索引函数。