【问题标题】:Change values of a column based on most frequently value on other column根据其他列上最常见的值更改列的值
【发布时间】: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 

【问题讨论】:

标签: python python-3.x pandas


【解决方案1】:

尝试groupby()+transform() 并计算模式并使用mask() 创建NaN,其中'predicted' 为负数:

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

【讨论】:

  • 很好,这样在我的测试用例中执行速度至少快了 10 倍。谢谢,我会进一步研究这些方法。
猜你喜欢
  • 2022-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-19
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多