2017-02-20 99 views
1

我有一個關於熊貓dataframes一個問題:熊貓據幀GROUPBY:雙GROUPBY和應用功能

我有類似下面的數據幀,

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. 組DF通過第一列「一」,
  2. 然後組中的每個分組的對象的「B」
  3. 計算使用「c」該B組
  4. 的平均值計算所有B groupbs的手段對於一個「一」
  5. 這是存儲在「新關口」的一個最終值「a」

我可以想像,這是有點難以理解,但我希望這是可以理解的,不過。

我取得了理想的結果,但我需要它的一個巨大的數據幀,我的解決辦法大概是多少減緩,

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()

非常感謝您提前!

回答

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
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 
2
In [57]: df.groupby(['a','b'])['c'].mean().mean(level=0).reset_index() 
Out[57]: 
    a c 
0 1 30 
1 2 100