代码之家  ›  专栏  ›  技术社区  ›  acolls_badger

熊猫通过产生一个系列来分组;不是Group By对象

  •  3
  • acolls_badger  · 技术社区  · 6 年前

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

    我在此数据帧上运行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
    

    查看分组的交易似乎是groupby对象,而不是序列此外,它是创建的,但在Pandas数据帧上运行.groupby方法因此,我不确定为什么这是一个系列。

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

    2 回复  |  直到 6 年前
        1
  •  2
  •   jpp    6 年前

    索引A 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
  •  3
  •   iacob    6 年前

    它是预期的行为(如果方法是像 groupby 使用聚合函数)获取 Series DataFrame .

    如果你需要 子句 对象:

    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