我对regex还是比较陌生,我正在尝试替换Pandas DataFrame中string列内的部分字符串。挑战在于,我想从列中删除多个字符串类型,同时保留其余字符串。
我有适用于1种类型字符串的代码,但是当我尝试使用for循环时,该代码不起作用。我不确定如何在正则表达式中指定迭代器。
以下是适用于一种类型的子字符串的代码:
df = pd.DataFrame({'A': ['ba ca t', 'foo', 'bait'],'B': ['abc', 'bar', 'xyz']})
df
df=df.replace({'A': r'^ba ca'}, {'A': ''}, regex=True)
df
以下是我尝试使用For Loop时无法正常工作的代码:
df = pd.DataFrame({'A': ['ba ca t', 'foo', 'bait'],'B': ['abc', 'bar', 'xyz']})
replace_list=['ba ca','foo']
for i in replace_list:
df=df.replace({'A': r'^(i)'}, {'A': ''}, regex=True)
df
我想遍历字符串列表以将其从DataFrame的列中删除。
答案 0 :(得分:3)
'^(i)'
不是执行字符串插值的正确方法。您正在根据f字符串格式(rf'^{i}'
)或str.format
(r'^{}'.format(i)
)寻找东西。
尽管这里更好的解决方案是放弃循环,因为replace
允许您一次执行多个替换。
df.replace({'A': replace_list}, '', regex=True)
A B
0 t abc
1 bar
2 bait xyz
或者,用str.replace
:
df['A'].str.replace('|'.join(replace_list), '')
0 t
1
2 bait
Name: A, dtype: object
我的这篇帖子也值得一读:What is the difference between Series.replace and Series.str.replace?
答案 1 :(得分:2)
由于您不想i
来修改正则表达式模式,因此您应该考虑以下更改:
df=df.replace({'A': r'^({})'.format(i)}, {'A': ''}, regex=True)
输出
+----+-------+-----+
| | A | B |
+----+-------+-----+
| 0 | t | abc |
| 1 | | bar |
| 2 | bait | xyz |
+----+-------+-----+