首页 > 解决方案 > 根据其他列上最常见的值更改列的值

问题描述

我有一个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 

标签: pythonpython-3.xpandas

解决方案


尝试groupby()+transform()并计算模式并用于mask()创建“预测”为负数的 NaN:

myDf['renamed']=(myDf.groupby('predicted')['label']
                    .transform(lambda x:x.mode().iloc[0])
                    .mask(myDf['predicted'].le(-1)))

推荐阅读