pandas groupby,其中您获得一列的最大值和另一列的最小值

时间:2017-06-06 06:48:54

标签: python pandas pandas-groupby

我的数据框如下:

user    num1    num2
a       1       1
a       2       2
a       3       3
b       4       4
b       5       5

我想要一个数据帧,每个用户的num1最小值为num1,每个用户的最大值为num2。

输出应该是:

user    num1    num2
a       1       3
b       4       5

我知道如果我想要两列的最大值,我可以这样做:

a.groupby('user')['num1', 'num2'].max()

是否有一些相同的东西,而不必做类似的事情:

series_1 = a.groupby('user')['num1'].min() 
series_2 = a.groupby('user')['num2'].max()

# converting from series to df so I can do a join on user
df_1 = pd.DataFrame(np.array([series_1]).transpose(), index=series_1.index, columns=['num1']) 
df_2 = pd.DataFrame(np.array([series_2]).transpose(), index=series_2.index, columns=['num2'])

df_1.join(df_2)

2 个答案:

答案 0 :(得分:9)

dict之前使用groupby + agg,因此必须按subsetreindex_axis排序。如有必要,最后添加reset_index以便将index转换为column

df = a.groupby('user').agg({'num1':'min', 'num2':'max'})[['num1','num2']].reset_index()
print (df)
  user  num1  num2
0    a     1     3
1    b     4     5

与...相同:

df = a.groupby('user').agg({'num1':'min', 'num2':'max'})
                      .reindex_axis(['num1','num2'], axis=1)
                      .reset_index()
print (df)
  user  num1  num2
0    a     1     3
1    b     4     5

答案 1 :(得分:1)

如果有人想获取特定列的第一个和最后一个值,我想添加到@jezrael 的答案中,可以通过与以下相同的方式完成:

df.groupby(['user']).agg({'num1':'min', 'num2':'max', 'num3':'first', 'num4':'last', 'num5':'sum'})