groupby:如何显示max(field1)和与max(field1)对应的field2的值?

时间:2019-09-16 16:27:44

标签: python pandas pandas-groupby

比方说,我有一个包含3个字段的表格:客户,城市,销售额,销售额是浮动的。

+--------+--------+-------+
| client |  city  | sales |
+--------+--------+-------+
| a      | NY     |     0 |
| a      | LA     |     1 |
| a      | London |     2 |
| b      | NY     |     3 |
| b      | LA     |     4 |
| b      | London |     5 |
+--------+--------+-------+

对于每个客户,我想展示什么是销售额最大的城市,以及那些销售额是多少,即我想要以下输出:

+--------+--------+-------+
| client |  city  | sales |
+--------+--------+-------+
| a      | London |     2 |
| b      | London |     5 |
+--------+--------+-------+

有什么建议吗?

此表可以通过以下方式生成:

df=pd.DataFrame()
df['client']= np.repeat( ['a','b'],3 )
df['city'] = np.tile( ['NY','LA','London'],2)
df['sales']= np.arange(0,6)

这是错误的,因为它会计算城市的“最大”,并显示NY,因为它认为N> L

max_by_id = df.groupby('client').max()

我可以先创建一个销售额最高的数据框,然后将其与初始数据框合并以检索城市;可以,但是我想知道是否有更快/更优雅的方式?

out = pd.merge( df, max_by_id, how='inner' ,on=['client','sales'] )

我记得在SQL中对交叉应用语句做了类似的事情,但不知道如何运行等效的Pandas。

1 个答案:

答案 0 :(得分:1)

您需要先按sales排序,然后按groupby client排序并选择first

df.sort_values(['sales'], ascending=False).groupby('client').first().reset_index()

OR

作为@ user3483203:

df.loc[df.groupby('client')['sales'].idxmax()]

输出:

 client city    sales
0   a   London  2
1   b   London  5