python - 根据正则表达式条件替换 Pandas 系列中的整个列值

标签 python pandas

我需要什么

当满足条件时,我需要替换 Pandas 系列中的整个列值。例如,考虑以下系列:

d = ["foo", "bar", "bbl dklha", "bbl hoi", "bbl lala ho", "bbl ljhkh"]
ser = pd.Series(data=d)

如下所示:

0            foo
1            bar
2      bbl dklha
3        bbl hoi
4    bbl lala ho
5      bbl ljhkh
dtype: object

我现在需要的是,每个以 bbl 开头的字符串都应该替换为“bbl leerling”,如下所示:

0             foo
1             bar
2    bbl leerling
3    bbl leerling
4    bbl leerling
5    bbl leerling
dtype: object

我为此使用正则表达式(我需要它是正则表达式,这个示例经过简化,但实际上正则表达式更复杂)。

我尝试过的

ser = ser.str.replace(pat=r'^bbl', repl="bbl leerling", regex=True)
ser = ser.replace(to_replace=r'^bbl', value="bbl leerling", regex=True)

但是两者都只是用所需的字符串替换出现的子字符串,如下所示:

0                     foo
1                     bar
2      bbl leerling dklha
3        bbl leerling hoi
4    bbl leerling lala ho
5      bbl leerling ljhkh
dtype: object

如何才能替换整个值?我一直在 Series.replaceSeries.str.replace 中寻找某种参数来执行此操作,但似乎没有。我不想循环这个系列,使用列表理解或 .apply,因为此代码将在 Spark 生产集群上运行,而这些构造不可用/不可行。

最佳答案

选项 1,使用后视和 str.replace :

out = ser.str.replace(r'(?<=^bbl ).*', 'leerling', regex=True)

# or without lookbehind
out = ser.str.replace(r'^bbl .*', 'bbl leerling', regex=True)

选项 2,可能更有效,使用 boolean indexing对于就地修改:

ser[ser.str.startswith('bbl ')] = 'bbl leerling'

输出:

0             foo
1             bar
2    bbl leerling
3    bbl leerling
4    bbl leerling
5    bbl leerling
dtype: object

关于python - 根据正则表达式条件替换 Pandas 系列中的整个列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76210610/

相关文章:

python - 为什么在使用 pandas 处理 csv 文件时不保留列顺序?

python - Statsmodels - 负二项式不收敛,而 GLM 收敛

python - 将对象转换为日期时间会引发错误

python - 使用pandas GroupBy或pivot_table查找每日最低值(value)

python - 检查 Numpy 数组(和 Pandas DataFrame)中的所有元素并有选择地更改

python - 从 pandas 数据框中选择不连续和连续的列

python - 如何将对象数据类型转换为在 Pandas 中 float

python - Django - 以geoJSON格式获取多边形的质心

python - ffmpeg drawtext 在整个视频空间上重复覆盖文本

python - Pandas:查找一列中相隔 50 个单位的连续项目