【问题标题】:Pandas Group By producing a series; not a groupby object熊猫集团通过制作系列;不是 groupby 对象
【发布时间】:2018-07-22 09:42:38
【问题描述】:

我有一个 Pandas 交易数据框:

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 对象,而是一个系列:

In: type(grouped_transactions)
Out: pandas.core.series.Series

查看 grouped_transactions 似乎是一个 groupby 对象,而不是一个系列。此外,它被创建但在 Pandas DataFrame 上运行 .groupby 方法。因此,我不确定为什么它是一个系列。

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

【问题讨论】:

  • 如果想使用 groupby 对象,需要g = transactions.groupby(['Purchase_Type','year_month'])['Amount'],但是使用 groupby 对象的原因是什么?预期输出是什么?
  • 如果你想要groupby对象,为什么要立即在它后面加上['Amount'].sum()?你正在扔掉你想要的东西。

标签: python pandas dataframe pandas-groupby


【解决方案1】:

获得SeriesDataFrame 的预期行为(如果方法像groupby 那样与聚合函数链接在一起)。

如果你需要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'>
    

    【讨论】:

      【解决方案3】:

      使用这个:

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

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

      【讨论】:

      • 这与制作系列的问题有什么关系?你能详细说明一下吗?
      • 因为我相信他使用了单括号,所以 grouped_transactions 是一个系列而不是一个数据框。如果我错了,请纠正我,我刚开始学习。谢谢。
      猜你喜欢
      • 2013-07-29
      • 1970-01-01
      • 2019-02-24
      • 2016-10-22
      • 1970-01-01
      • 2020-03-25
      • 2016-04-21
      • 2019-03-20
      • 1970-01-01
      相关资源
      最近更新 更多