基于正则表达式条件替换Pandas系列中的整个列值

cig3rfwq  于 2023-05-12  发布在  其他
关注(0)|答案(3)|浏览(221)

我需要的

当满足条件时,我需要替换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生产集群上运行,而这些构造是不可用/不可行的。

ee7vknir

ee7vknir1#

选项1,使用lookbehind和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,可能更有效,使用布尔索引进行就地修改:

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
4dbbbstv

4dbbbstv2#

尝试使用startswith

data="""
            foo
            bar
      bbl dklha
        bbl hoi
    bbl lala ho
      bbl ljhkh
"""

def create_list(data):
    return data.split()

my_list = create_list(data)

print(my_list)

def replace_element(list, replace_word):
    for i in range(len(list)):
        if list[i].startswith(replace_word):
            list[i] = 'bbl_leerling'

    return my_list

print(replace_element(my_list, 'bbl'))

输出:

['foo', 'bar', 'bbl', 'dklha', 'bbl', 'hoi', 'bbl', 'lala', 'ho', 'bbl', 'ljhkh']
['foo', 'bar', 'bbl_leerling', 'dklha', 'bbl_leerling', 'hoi', 'bbl_leerling', 'lala', 'ho', 'bbl_leerling', 'ljhkh']
zrfyljdw

zrfyljdw3#

你也可以查一下

ser.replace({'bbl':1},regex=True).replace(1,'bbl leerling')
Out[9]: 
0             foo
1             bar
2    bbl leerling
3    bbl leerling
4    bbl leerling
5    bbl leerling
dtype: object

相关问题