Skip to main content
 首页 » 编程设计

python之Pandas Dataframe groupby : double groupby & apply function

2025年05月04日29haluo1

我有一个关于 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”对 df 进行分组,
  2. 然后将每个分组对象分组为“b”
  3. 计算这个 b 组的“c”的平均值
  4. 计算一个“a”的所有b-groupbs的均值
  5. 这是存储在“new col”中的一个“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()

非常感谢您!

请您参考如下方法:

这是一种方式

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