我有一个包含以下 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
我已经从 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
假设您想要每组计数的较小模式,请使用自定义函数:
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