【发布时间】:2021-08-09 12:50:18
【问题描述】:
我有一个这样的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'
但我认为这不是最好的方法。有没有办法更好地做到这一点?(在速度或内存方面)
我还认为在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
【问题讨论】:
-
@politinsa 我的问题不仅在于获取频率最高,还在于如何以良好的性能创建具有此值的新列。和你发送的堆栈不是同一个问题
-
然后用groupby看看最常见的值:stackoverflow.com/questions/15222754/…
标签: python python-3.x pandas