Pandas:使用一个列进行分组,获取多个其他列的统计信息

3

我有一个包含3列的数据框。

ID col1 col2 
A1 1 12
A1 3 10
A1 4 16
........
A9 9 18
A9 7 11
A9 8 15

我想创建一个新的数据框,其中包含以下列:

ID col1_min, col1_max, col2_min, col2_max.

A1 1         4         10        16
...........
A9 7         9         11        18

我可以使用groupby来完成这个任务。

col1_min = df.groupby(['ID'])['col1'].min()
col1_max = df.groupby(['ID'])['col1'].max()
col2_min = df.groupby(['ID'])['col2'].min()
col2_max = df.groupby(['ID'])['col2'].max()

df2 = pd.DataFrame({'col1_min':col1_min, 'col1_max':col1_max, 'col2_min':col2_min, 'col2_max':col2_max})

一定有更好、更优美的方式(一行代码)吧?

非常感谢。

3个回答

4
df.groupby('ID').agg(['min', 'max'])

   col1     col2    
    min max  min max
ID                  
A1    1   4   10  16
A9    7   9   11  18

使用“展平”功能来合并列

d = df.groupby('ID').agg(['min', 'max'])
d.columns = d.columns.map('_'.join)
d

    col1_min  col1_max  col2_min  col2_max
ID                                        
A1         1         4        10        16
A9         7         9        11        18

如果您的列标题是数字,您可以使用以下方法:
d = df.groupby('ID').agg(['min', 'max'])
d.columns = d.columns.map('{0[0]}_{0[1]}'.format)
d

    col1_min  col1_max  col2_min  col2_max
ID                                        
A1         1         4        10        16
A9         7         9        11        18

最后,使用reset_index将索引恢复到数据框中。

d = df.groupby('ID').agg(['min', 'max'])
d.columns = d.columns.map('{0[0]}_{0[1]}'.format)
d.reset_index()

   ID  col1_min  col1_max  col2_min  col2_max
0  A1         1         4        10        16
1  A9         7         9        11        18

2

使用groupby和agg函数

df = df.groupby('ID').agg({'col1': ['min', 'max'], 'col2': ['min', 'max']}).reset_index()
df.columns = df.columns.map('_'.join)min', 'max']})

    ID_ col1_min    col1_max    col2_min    col2_max
0   A1  1           4           10          16
1   A9  7           9           11          18

1

我认为PiR和Vai已经提供了很好的答案,但如果你想要不同的东西,你可以看看这个...

from functools import reduce
df1=df.groupby('ID')['col1','col2'].apply(lambda x: [x.min().values,x.max().values])
pd.DataFrame(data=[reduce(lambda x,y:  np.append(x,y),l) for l in df1],index=df1.index,columns=np.core.defchararray.add(np.repeat(['col1','col2'], 2),np.tile(['min','max'],2))) 


Out[1001]: 
    col1min  col1max  col2min  col2max
ID                                    
A1        1       10        4       16
A9        7       11        9       18

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接