假设我有一个包含 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
排序,然后groupby
client
并首先选择
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