pandas groupby 获取一列的最大值和另一列的最小值
pandas groupby where you get the max of one column and the min of another column
我有一个数据框如下:
user num1 num2
a 1 1
a 2 2
a 3 3
b 4 4
b 5 5
我想要一个数据框,每个用户从 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)
如有必要,使用 groupby
+ agg
by dict
, so then is necessary order columns by subset
or reindex_axis
. Last add 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
如果有人想获取特定列的第一个和最后一个值,我想添加到@jezrael 的回答中,可以用与以下相同的方式完成:
df.groupby(['user']).agg({'num1':'min', 'num2':'max', 'num3':'first', 'num4':'last', 'num5':'sum'})
我有一个数据框如下:
user num1 num2
a 1 1
a 2 2
a 3 3
b 4 4
b 5 5
我想要一个数据框,每个用户从 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)
如有必要,使用 groupby
+ agg
by dict
, so then is necessary order columns by subset
or reindex_axis
. Last add 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
如果有人想获取特定列的第一个和最后一个值,我想添加到@jezrael 的回答中,可以用与以下相同的方式完成:
df.groupby(['user']).agg({'num1':'min', 'num2':'max', 'num3':'first', 'num4':'last', 'num5':'sum'})