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

Posted

技术标签:

【中文标题】使用 lambda 以字符串开头时替换 DataFrame 列中的值【英文标题】:Replace values in DataFrame column when they start with string using lambda 【发布时间】:2019-12-28 01:44:20 【问题描述】:

我有一个数据框:

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

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

我尝试了很多关于替换、应用和映射的方法,但我能做的最好的是 False、True、True、False。

以下方法可行,但我想知道一种更好的方法,我认为应用、替换和 lambda 可能是更好的方法。

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

【问题讨论】:

您的数据框是否只有 1 列?并且 apply 不是首选方式 bdw 数据框有很多列 并且每列都有以XXX 开头的值,您想用np.nan 替换它还是只有1 列? 【参考方案1】:

使用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的性能对比

【讨论】:

优秀。这个答案帮助我更好地理解这种事情的 lambda。【参考方案2】:

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

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

性能与适​​用于更大的 dfs:

【讨论】:

我喜欢你提出的 np.where 选项。 apply lambda 如何对其进行测试? @McRae 检​​查this【参考方案3】:

不需要使用.loc。只写:

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

如果您想计算一些,可能需要 Lambda 函数 要替换的表达式。在这种情况下,只需np.nan 就足够了。

【讨论】:

非常感谢您的回答。看来我还是走对了路?? 我实际上是关于应用一个 lambda 函数,它返回一些要替换的值。在这种情况下,要替换的值只是 np.nan,因此无需应用任何 lambda 函数。

以上是关于使用 lambda 以字符串开头时替换 DataFrame 列中的值的主要内容,如果未能解决你的问题,请参考以下文章

如果行以另一个字符串开头,则替换文件中的字符串

sed:查找并替换以特定字符串开头的行中的第 n 个字符

查找并替换所有以 # 开头的单词,并将标签文本包装在 HTML 中

Powershell:替换所有以相同Unicode字符开头的不同子字符串(正则表达式?)

如何仅在 Oracle SQL 中的字符串开头替换出现?

如果存在,则替换文件中以字符串开头的行,如果不存在则添加