在pandas中用assign替换值
我有一个数据框:
df = pd.DataFrame({'Address': ['234 JALAN ST KULAR LUMPUR MALAYSIA',
'123 BUILDING STREET SINGAPORE',
'67 CANNING VALE, HONG KONG',
np.nan]})
df
Address
0 234 JALAN ST KULAR LUMPUR MALAYSIA
1 123 BUILDING STREET SINGAPORE
2 67 CANNING VALE, HONG KONG
3 NaN
我想添加一个新列。在这个例子中,我首先把NaN(缺失值)替换成--
,其余的非NaN值都变成'Yes'。所以我尝试了这个:
df_mod = (
df
.assign(
verify = lambda x: '--' if x['Address'].isna() else 'Yes'
)
)
我想用链式操作来完成,因为数据集中还有更多的列。但是我遇到了这个错误:ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
这是我期望的结果:
df
Address Verify
0 234 JALAN ST KULAR LUMPUR MALAYSIA Yes
1 123 BUILDING STREET SINGAPORE Yes
2 67 CANNING VALE, HONG KONG Yes
3 NaN --
请问,如何使用'assign'来做到这一点,任何帮助都非常欢迎。
2 个回答
1
试试下面这段代码:
df_mod = (
df
.assign(
verify = lambda x: x['Address'].apply(lambda addr: '--' if pd.isna(addr) else 'Yes')
)
)
我在我的电脑上测试过了,效果很好,运行得很正常。
2
代码
如果你想使用布尔遮罩(也就是用真或假来筛选数据),可以使用布尔遮罩的函数(比如 mask
、where
、np.where
等),而不是用 if
。
import numpy as np
out = df.assign(verify=np.where(df['Address'].isna(), '--','Yes'))
输出
Address verify
0 234 JALAN ST KULAR LUMPUR MALAYSIA Yes
1 123 BUILDING STREET SINGAPORE Yes
2 67 CANNING VALE, HONG KONG Yes
3 NaN --
如果你必须使用带有 lambda 函数的 assign 函数来进行布尔遮罩,可以使用以下代码:
out = df.assign(verify=lambda x: np.where(x['Address'].isna(), '--','Yes'))
你提供的代码是无效的。请检查以下代码:
'--' if df['Address'].isna() else 'Yes'
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
相关内容:可以参考以下帖子了解错误: