在pandas中用assign替换值

0 投票
2 回答
55 浏览
提问于 2025-04-14 15:30

我有一个数据框:

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

代码

如果你想使用布尔遮罩(也就是用真或假来筛选数据),可以使用布尔遮罩的函数(比如 maskwherenp.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().

相关内容:可以参考以下帖子了解错误:

系列的真值是模糊的,使用空的、布尔的、项的或任何的

撰写回答