python - 根据其他列上最常见的值更改列的值
问题描述
我有一个pandas.DataFrame
这样的:
expl = {'label':['A','A','A','B','B','B','C','C','C','C','C','A','A'],
'predicted':[1,1,3,2,2,1,3,2,3,4,4,-1,-2]}
}
myDf = DataFrame(expl)
我想创建一个新列,其中包含“预测”列上的值,但“重命名”了每个“标签”中“预测”上最常见的值。
我目前正在使用以下代码,它按预期工作:
for group in myDf['predicted'].unique():
if group >=0:
dfg = myDf.loc[myDf['predicted']==group, ['label']]
rename = myDf.loc[myDf['predicted']==group, ['label']].groupby(['label']).size().idxmax()
myDf.loc[myDf['predicted']==group,'renamed']= rename
else:
myDf.loc[myDf['predicted']==group,'renamed']= 'NA'
但我认为这不是最好的方法。有没有办法更好地做到这一点?(在速度或内存方面)
我还认为在 a 上保存最频繁的值dict
并用于myDf['predict'].apply(lambda v: d[v] )
替换这些值,但似乎并没有更快。
注意:负值将被视为不可用('NA'
)。
预期输出:
label predicted renamed
0 A 1 A
1 A 1 A
2 A 3 C
3 B 2 B
4 B 2 B
5 B 1 A
6 C 3 C
7 C 2 B
8 C 3 C
9 C 4 C
10 C 4 C
11 A -1 NA
12 A -2 NA
解决方案
尝试groupby()
+transform()
并计算模式并用于mask()
创建“预测”为负数的 NaN:
myDf['renamed']=(myDf.groupby('predicted')['label']
.transform(lambda x:x.mode().iloc[0])
.mask(myDf['predicted'].le(-1)))
推荐阅读
- javascript - 如何使用带有数组的状态挂钩
- c# - 如何在 NewExpression 的参数(类型为 MemberExpression)中有效地使用 `?.` 运算符
- c# - 在 ASP.NET 5 API 中返回 IP 和端口
- sql - filepp 预处理 SQL 文件
- sql-server - 选择与 ; 相关的语法问题
- java - 如何在 Spring Boot 中从泛型参数(与任何类无关)中获取值
- node.js - MongoDb Node JS 包是否适用于 cron 和 crontab?
- oracle - Oracle 服务总线/XSL 映射/附加源
- javascript - 删除事件未获取文件列表
- web-scraping - 刮取产品的可用性