比方说,我有一个包含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。
答案 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