使用lambda将DataFrame列中以字符串开头的值替换

7

我有一个数据框:

import pandas as pd
import numpy as np
x = {'Value': ['Test', 'XXX123', 'XXX456', 'Test']}
df = pd.DataFrame(x)

我希望使用lambda将以XXX开头的值替换为np.nan。

我已经尝试了很多用replace、apply和map的方法,但最好的结果只有False、True、True、False。

下面的方法可以实现,但我想知道更好的方法,我认为使用apply、replace和lambda可能是更好的方法。

df.Value.loc[df.Value.str.startswith('XXX', na=False)] = np.nan

你的数据框中只有一个列吗?而且应用程序并不是首选方式。顺便说一下。 - anky
数据框有许多列。 - McRae
每一列的值都以'XXX'开头,您想用'np.nan'来替换它们,还是只有一个列? - anky
3个回答

15

使用apply方法

In [80]: x = {'Value': ['Test', 'XXX123', 'XXX456', 'Test']}
In [81]: df = pd.DataFrame(x)
In [82]: df.Value.apply(lambda x: np.nan if x.startswith('XXX') else x)
Out[82]:
0    Test
1     NaN
2     NaN
3    Test
Name: Value, dtype: object

apply、where和loc的性能比较 enter image description here


太棒了!这个答案帮助我更好地理解了在这种情况下如何使用lambda函数。 - McRae

5

np.where() 在这里的表现更好:

df.Value=np.where(df.Value.str.startswith('XXX'),np.nan,df.Value)

大型数据框上的性能比较:

enter image description here


1
我喜欢你提出的np.where选项。如何使用apply lambda对其进行测试? - McRae
@McRae 请查看这个链接 - anky

1

不必使用.loc,只需写:

df.Value[df.Value.str.startswith('XXX')] = np.nan

如果您想计算一些表达式以进行替换,则可能需要使用Lambda函数。在这种情况下,只需使用np.nan即可。


非常感谢您的回答。看起来我已经走在了正确的道路上了吗? - McRae
我考虑实际应用一个lambda函数,它返回一些值以进行替换。在这种情况下,要替换的值只是np.nan,因此不需要应用任何lambda函数。 - Valdi_Bo

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