在 pandas DataFrame 中查找每个组的模式

问题描述 投票:0回答:1

我有一个包含以下 3 列的数据框:属性、值、计数

(属性、值)对是唯一的。

我需要向该数据框添加一个新列,这将检查 count 中的值是否是其属性列值中最常见的值。因此,例如:

我们有一个数据框

property,value,count
p1,v1,20
p1,v2,50
p1,v3,50
p2,v4,10
p2,v5,20

因此我们需要得到:

property,value,count,is_mode
p1,v1,20,False
p1,v2,50,True
p1,v3,50,True
p2,v4,10,True
p2,v5,20,False 
  • 如果有多种模式,我需要使用最小的模式来计算 is_mode 值。所以在这里,对于 p2 有模式 - 10、20,但由于我需要最小的模式,因此对于 10 is_mode 将为 True,对于 20 则为 False

我已经从 stackoverflow 找到了许多解决方案,但这些并没有给我带来任何好的结果。 由于某种原因

我尝试将任务拆分为首先获取每个属性的模式,然后以某种方式将这些值与该组的最小模式进行比较:

new_df = df.groupby(["property"])["count"].agg(pd.Series.mode)

如果我尝试将其附加到当前数据框,则相同:

properties["mode"] = properties.groupby(["property"])["count"].transform(pd.Series.mode)

这些不会压碎,但它们会产生很多奇怪的结果。例如,我有:

property,value,count
p1,v1,200
p1,v2,60
p1,v3,60

并期望得到:

property,value,count,mode
p1,v1,200,60
p1,v2,60,60
p1,v3,60,60

但就我而言,我得到:

property,value,count,mode
p1,v1,200,NaN
p1,v2,60,NaN
p1,v3,60,NaN
pandas dataframe group-by
1个回答
0
投票

假设您想要每组计数的较小模式,请使用自定义函数:

df['is_mode'] = (df.groupby('property')['count']
                   .transform(lambda s: s.eq(s.mode().min()))
                )

输出:

  property value  count  is_mode
0       p1    v1     20    False
1       p1    v2     50     True
2       p1    v3     50     True
3       p2    v4     10     True
4       p2    v5     20    False
© www.soinside.com 2019 - 2024. All rights reserved.