Pandas Dataframe groupby:double groupby&应用函数

时间:2017-02-20 18:26:23

标签: python pandas dataframe

我有关于pandas数据帧的问题:

我有一个类似以下的数据框,

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",
  2. 分组df
  3. 然后将每个分组对象分组为" b"
  4. 计算" c"的平均值。对于这个b-group
  5. 计算一个" a"
  6. 的所有b-groupbs的均值
  7. 这是存储在" new col"中的最终值。一个" a"
  8. 我可以想象这有点令人困惑,但我希望这是可以理解的。

    我达到了预期的效果,但是因为我需要一个庞大的数据帧,我的解决方案可能会慢很多,

    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("&#34)。GROUPBY(" B")[" C&#34]。意味着()

    非常感谢你!

3 个答案:

答案 0 :(得分:2)

这是单程

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

答案 1 :(得分:2)

supportedProtocols

答案 2 :(得分:1)

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