python自定义汇总表

时间:2019-11-25 13:22:54

标签: python pandas

我有一张看起来像下面的桌子:

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

2 个答案:

答案 0 :(得分:5)

GroupBy.agg重塑为DataFrame.stack,将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

答案 1 :(得分:2)

准备数据

dd = {'A': {0: 1, 1: 1, 2: 2, 3: 2, 4: 3, 5: 3}, 'B': {0: 1, 1: 1, 2: 3, 3: 4, 4: 1, 5: 0}, 'C': {0: 2, 1: 3, 2: 0, 3: 2, 4: 4, 5: 2}, 'D': {0: 3, 1: 3, 2: 1, 3: 3, 4: 1, 5: 4}}
df = pd.DataFrame.from_dict(dd)    
df

Out[1]:
    A   B   C   D
0   1   1   2   3
1   1   1   3   3
2   2   3   0   1
3   2   4   2   3
4   3   1   4   1
5   3   0   2   4

解决方案

我们正在使用df.melt()取消

df1 = df.melt(id_vars=['A'], var_name = 'Metric').groupby(['A','Metric']).agg(['min', 'mean', 'max'])
df1.columns = ['min','mean','max']
df1

Out[2]:
           min  mean    max
A   Metric          
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