[英]Getting idxmax values in pandas groupby in case of equal values or ties
我正在尝试确定最可能发生的客户事件(运输)。 这是一个示例 df:
df = pd.DataFrame({'customer id':[1,1,1,2,2,2,2,2,2,2,3,3],
'Trans':['Car','Car','Bus','Bus','Bus','Bus','Car','Car','Car','Plane','Car','Bus']})
给出:
customer id Trans
0 1 Car
1 1 Car
2 1 Bus
3 2 Bus
4 2 Bus
5 2 Bus
6 2 Car
7 2 Car
8 2 Car
9 2 Plane
10 3 Car
11 3 Bus
我做了以下步骤来获得每个customer id
的最大可能值:
#Get the count & percent of each customer id transportation
df2 = df.groupby(['customer id','Trans'])['Trans'].size().reset_index(name='Trans Counts')
df2['percent'] = df2.groupby("customer id")['Trans Counts'].transform(lambda x: (x / x.sum()).round(2))
#Get records > 1
df3 = df2[df2['Trans Counts'] > 1]
所以我得到了这个df:
customer id Trans Trans Counts percent
1 1 Car 2 0.67
2 2 Bus 3 0.43
3 2 Car 3 0.43
customer id
2 有一个平局,所以当我使用idxmax()
时:
df3.loc[df3.groupby('customer id')['Trans Counts'].idxmax()]
它只显示第一行:
customer id Trans Trans Counts percent
1 1 Car 2 0.67
2 2 Bus 3 0.43
如果出现平局,如何获得同一组中的前 2 条记录? 我也使用了 try nlargest(2)
但我得到了整个 df 不在分组内的结果,如果我在聚合 function 中使用它,它不会显示预期的输出!
平局时预期的 output:
customer id Trans Trans Counts percent
1 1 Car 2 0.67
2 2 **Bus, Car** 3 0.43
谢谢
您可以创建一个“排名”列:
df3["rank"] = df3.groupby("customer id")["Trans Counts"].rank(method="min")
df3
# Out[83]:
# customer id Trans Trans Counts percent rank
# 1 1 Car 2 0.67 1.0
# 2 2 Bus 3 0.43 1.0
# 3 2 Car 3 0.43 1.0
使用method="min"
,当值相同时使用最低等级(在本例中为 1,而不是 2(最大值)或 1.5(平均值))。 然后,您可以为最频繁的那些指定df3[df3["rank"] == 1]
。
您很可能将所有这些组合在一起,以免在代码中多次使用groupby
以提高效率。
这是根据最大运输类型分配新列的方法
In [144]: df2 = pandas.get_dummies(df).groupby("customer id").sum()
# Trans_Bus Trans_Car Trans_Plane
#customer id
#1 1 2 0
#2 3 3 1
#3 1 1 0
In [145]: df2['max_cols'] = [ ",".join([col for col in df2 if df2.lo
...: c[i,col]==mx]) for i,mx in df2.max(axis=1).items()]
In [146]: df2
Out[146]:
Trans_Bus Trans_Car Trans_Plane max_cols
customer id
1 1 2 0 Trans_Car
2 3 3 1 Trans_Bus,Trans_Car
3 1 1 0 Trans_Bus,Trans_Car
删除Trans_
前缀并添加百分比列应该是一件简单的事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.