与熊猫循环循环中的多个正则表达式替换

时间:2019-06-20 21:37:14

标签: python regex pandas loops

我对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的列中删除。

2 个答案:

答案 0 :(得分:3)

'^(i)'不是执行字符串插值的正确方法。您正在根据f字符串格式(rf'^{i}')或str.formatr'^{}'.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 |
+----+-------+-----+