我有一个包含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})
必须有更好更优雅的方式(一个班轮)?
非常感谢提前。
答案 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