根据datafram中另一列的条件应用特定函数来替换列的值

2024-06-26 14:41:54 发布

您现在位置:Python中文网/ 问答频道 /正文

以下是我要做的:

Dataframe before: 
       name         value    apply_f
0      SEBASTIEN    9        false
1      JOHN         4        false
2      JENNY        np.inf   true

Apply function f: len(df['name']) to columns 'value' only if columns 'apply_f' == True 

Dataframe after: 
       name       value    apply_f
0      SEBASTIEN  9        False
1      JOHN       4        False
2      JENNY      5        True

以下是我目前的情况:

^{pr2}$

但结果并不是我所期望的:

    apply_f    name         value
0   False      SEBASTIEN    NaN
1   False      JOHN         NaN
2    True      JENNY        5

该列将初始值替换为NaN


Tags: columnsnamefalsetruedataframevaluenpnan
1条回答
网友
1楼 · 发布于 2024-06-26 14:41:54

它覆盖的原因是因为左侧的索引默认为整个数据帧,如果您同时使用loc将掩码应用到左侧,则它只影响满足条件的行:

In [272]:

df.loc[df['apply_f'] == True, 'value'] = df[df['apply_f'] == True]['name'].apply(lambda row: f(row))
df
Out[272]:
  apply_f       name  value
0   False  SEBASTIEN      9
1   False       JOHN      4
2    True      JENNY      5

上面使用loc是因为我使用了相同的布尔掩码语义,这可能有用,也可能不起作用,在最新的pandas版本中会引发一个错误:

^{pr2}$

对于您正在做的事情,使用numpy where将更加简洁易读:

In [279]:

df['value'] = np.where(df['apply_f']==True, len(df['name']), df['value'])
df
Out[279]:
  apply_f       name  value
0   False  SEBASTIEN      9
1   False       JOHN      4
2    True      JENNY      3

我知道您的示例是为了演示一个问题,但是您也可以在某些情况下使用where。在

相关问题 更多 >