gpt4 book ai didi

python - 应用特定函数根据数据框中另一列的条件替换列的值

转载 作者:太空宇宙 更新时间:2023-11-03 15:11:38 25 4
gpt4 key购买 nike

这是我想要做的:

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

最佳答案

它覆盖的原因是因为左侧的索引默认为整个数据帧,如果您也使用 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 是因为假设我使用了相同的 bool 掩码语义,这可能会或可能不会工作,并且会在最新的 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

关于python - 应用特定函数根据数据框中另一列的条件替换列的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25805756/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com