分组:如何显示 max(字段 1) 和字段 2 对应于 max(字段 1) 的值?



假设我有一个包含 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)

这是错误的,因为它计算城市的"最大值",并显示纽约,因为它认为 N> L

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

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

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

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

您需要按sales排序,然后groupbyclient并首先选择

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

如@user3483203:

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

输出:

client city    sales
0   a   London  2
1   b   London  5

最新更新