【问题标题】:Pandas Dataframe groupby: double groupby & apply functionPandas Dataframe groupby:双重分组和应用功能
【发布时间】:2017-07-10 03:50:24
【问题描述】:

我有一个关于熊猫数据框的问题:

我有一个如下的数据框,

df = pd.DataFrame([[1,1,10],[1,1,30],[1,2,40],[2,3,50],[2,3,150],[2,4,100]],columns=["a","b","c"])   

   a  b    c
0  1  1   10
1  1  1   30
2  1  2   40
3  2  3   50
4  2  3  150
5  2  4  100

我想产生以下输出,

  a "new col"
0 1 30
1 2 100

其中第一行计算如下:

  1. 按第一列“a”对 df 进行分组,
  2. 然后将每个分组的对象分组为“b”
  3. 计算该 b 组“c”的平均值
  4. 计算一个“a”的所有 b-groupb 的均值
  5. 这是一个“a”存储在“new col”中的最终值

我可以想象这有点令人困惑,但我希望这是可以理解的。

我达到了预期的结果,但由于我需要它来处理一个巨大的数据帧,我的解决方案可能会很慢,

pd.DataFrame([ [a, adata.groupby("b").agg({"c": lambda x:x.mean()}).mean()[0]] for a,adata in df.groupby("a") ],columns=["a","new col"])
   a  new col
0  1     30.0
1  2    100.0

因此,我需要的是(?) df.groupby("a").groupby("b")["c"].mean()

非常感谢您!

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    这是一种方法

    In [101]: (df.groupby(['a', 'b'], as_index=False)['c'].mean()
                 .groupby('a', as_index=False)['c'].mean()
                 .rename(columns={'c': 'new col'}))
    Out[101]:
       a  new col
    0  1       30
    1  2      100
    

    【讨论】:

      【解决方案2】:
      In [57]: df.groupby(['a','b'])['c'].mean().mean(level=0).reset_index()
      Out[57]:
         a    c
      0  1   30
      1  2  100
      

      【讨论】:

        【解决方案3】:
        df.groupby(['a','b']).mean().reset_index().groupby('a').mean()
        Out[117]: 
             b      c
        a            
        1  1.5   30.0
        2  3.5  100.0
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-03-09
          • 2018-01-11
          • 1970-01-01
          • 1970-01-01
          • 2019-01-31
          • 2018-10-06
          • 2021-10-04
          相关资源
          最近更新 更多