熊猫:对groupby使用一列,并为多个其他列获取统计信息

时间:2017-09-29 23:34:29

标签: pandas group-by

我有一个包含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 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

答案 2 :(得分: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