Skip to main content
 首页 » 编程设计

python自定义汇总表

2025年05月04日14mfryf

我有一张表格,如下所示:

    A   B   C   D 
    1   1   2   3 
    1   1   3   3 
    2   3   0   1 
    2   4   2   3 
    3   1   4   1 
    3   0   2   4 

我需要生成一个类似下面的表格:

    A   Metric  Min Mean    Max 
    1   B       1   1.0     1 
        C       2   2.5     3 
        D       3   3.0     3 
    2   B       3   3.5     4 
        C       0   1.0     2 
        D       1   2.0     3 
    3   B       0   0.5     1 
        C       2   3.0     4 
        D       1   2.5     4 

到目前为止我已经想到了这个。但看起来不太好。我确信有更好的方法:

grouped = df.groupby(['A']) 
for name, group in grouped: 
    dt = dict() 
    for str in ['max','mean','min']: 
        dt.update({str:group.agg(str)}) 
    print(pd.DataFrame(data = dt)) 
    print('----------') 
 
   max  mean  min 
B    1   1.0    1 
C    3   2.5    2 
D    3   3.0    3 
    ---------- 
    max  mean  min 
B    4   3.5    3 
C    2   1.0    0 
D    3   2.0    1 
    ---------- 
    max  mean  min 
B    1   0.5    0 
C    4   3.0    2 
D    4   2.5    1 
    ---------- 

请您参考如下方法:

使用GroupBy.agg通过 DataFrame.stack reshape 第一级为 0:

df = df.groupby('A').agg({'min', 'max', 'mean'}).stack(0) 
print (df) 
     max  mean  min 
A                   
1 B    1   1.0    1 
  C    3   2.5    2 
  D    3   3.0    3 
2 B    4   3.5    3 
  C    2   1.0    0 
  D    3   2.0    1 
3 B    1   0.5    0 
  C    4   3.0    2 
  D    4   2.5    1 

关于 DataFrameGroupBy.describe 的另一个想法:

df = df.groupby('A').describe().stack(0) 
print (df) 
      25%  50%   75%  count  max  mean  min       std 
A                                                     
1 B  1.00  1.0  1.00    2.0  1.0   1.0  1.0  0.000000 
  C  2.25  2.5  2.75    2.0  3.0   2.5  2.0  0.707107 
  D  3.00  3.0  3.00    2.0  3.0   3.0  3.0  0.000000 
2 B  3.25  3.5  3.75    2.0  4.0   3.5  3.0  0.707107 
  C  0.50  1.0  1.50    2.0  2.0   1.0  0.0  1.414214 
  D  1.50  2.0  2.50    2.0  3.0   2.0  1.0  1.414214 
3 B  0.25  0.5  0.75    2.0  1.0   0.5  0.0  0.707107 
  C  2.50  3.0  3.50    2.0  4.0   3.0  2.0  1.414214 
  D  1.75  2.5  3.25    2.0  4.0   2.5  1.0  2.121320 

编辑:

对于自定义函数,将其传递给函数列表 - 例如每组 0 的计数:

def func(x): 
    return (x == 0).sum() 
 
df = df.groupby('A').agg({'min', 'max', 'mean', func}).stack(0).rename_axis(('A', 'Metric')) 
print (df) 
A Metric                       
1 B          0    1   1.0    1 
  C          0    3   2.5    2 
  D          0    3   3.0    3 
2 B          0    4   3.5    3 
  C          1    2   1.0    0 
  D          0    3   2.0    1 
3 B          1    1   0.5    0 
  C          0    4   3.0    2 
  D          0    4   2.5    1