繁体   English   中英

在相等值或关系的情况下,在 pandas groupby 中获取 idxmax 值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM