在数据框中,根据另一列的条件,应用特定函数替换列的值。

3

我需要做的是:

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

这是我目前所拥有的:

from pandas import *
from numpy import *

df = DataFrame( { "name":  ['SEBASTIEN', 'JOHN', 'JENNY'] , 
                  "value": [9, 4, np.inf] , 
                  "apply_f":  [False,False,True]} )

def f(x):
    return len(x)

df['value'] = df[df['apply_f'] == True]['name'].apply(f)

但是结果并不是我所期望的:
    apply_f    name         value
0   False      SEBASTIEN    NaN
1   False      JOHN         NaN
2    True      JENNY        5

该列将初始值替换为 NaN。

非常感谢,解释得非常清晰,帮助我理解了我的错误!我也会尝试使用“numpy where”的解决方案。 - seb835
1个回答

4

之所以出现覆盖的情况,是因为左侧的索引默认为整个数据帧,如果您也使用 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版本中会引发错误:

In[274]:
df[df['apply_f'] == True]['value'] = df[df['apply_f'] == True]['name'].apply(lambda row: f(row))
df
-c:8: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead
Out[274]:
  apply_f       name     value
0   False  SEBASTIEN  9.000000
1   False       JOHN  4.000000
2    True      JENNY       inf

针对你正在做的事情,使用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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接