Python pandas `replace` 表现不一致

Python pandas `replace` is not acting consistent

我有一个庞大的数据库,我要从中删除各种长度的前导文本。这是一个最小的工作示例:

data = {'Title' : ['Bertram, C. et al., 2015a: Carbon', 
                   'Bertram, C. et al., 2015b: Complementing', 
                   'Bertram, C. et al., 2018: Targeted']}
df = pd.DataFrame(data, columns = ['Title'])

这给出了

                                      Title
0         Bertram, C. et al., 2015a: Carbon
1  Bertram, C. et al., 2015b: Complementing
2        Bertram, C. et al., 2018: Targeted

第一次尝试

我在 pandas replace 方法中应用 re

df['Title'].replace(r'(\A[\D\s.,]*\d\d\d\d[ab:] )', '', regex=True, inplace=True)

但这并不能解决所有情况:

                                      Title
0         Bertram, C. et al., 2015a: Carbon
1  Bertram, C. et al., 2015b: Complementing
2                                  Targeted

第二次尝试

我在 replace:

中使用 regex 命令
df['Title'].replace(regex=[r'(\A[\D\s.,]*\d\d\d\d:)', 
                           r'(\A[\D\s.,]*\d\d\d\da:)'
                           r'(\A[\D\s.,]*\d\d\d\db:)'], value='', inplace=True)

但这给出了相同的结果。

                                      Title
0         Bertram, C. et al., 2015a: Carbon
1  Bertram, C. et al., 2015b: Complementing
2                                  Targeted

第三次尝试

如果我重新排序正则表达式列表:

df['Title'].replace(regex=[r'(\A[\D\s.,]*\d\d\d\da:)', 
                           r'(\A[\D\s.,]*\d\d\d\db:)'
                           r'(\A[\D\s.,]*\d\d\d\d:)'], value='', inplace=True)

我有一点进步,但还不够:

                                      Title
0                                    Carbon
1  Bertram, C. et al., 2015b: Complementing
2                                  Targeted

想要的结果

    Title
0   Carbon
1   Complementing
2   Targeted

缺少相关问题

我仔细查看了 repandareplace 的文档,但有些不对劲。 None 的 SO 问答接近这个问题。

"[ab:]" 表示“a、b 或 :”。您需要 "[ab:]+"(“a、b 或 :,可能重复”),因为它们在 "2015a:" 中重复。通过此更正,第一种方法将起作用。

如果你总是以冒号 : 结尾并且想在它后面加上最后的话,你可能不想使用 re 模块。通常 re 比简单的字符串操作要慢得多。

备选方案可以是:

data = {'Title' : ['Bertram, C. et al., 2015a: Carbon', 
                   'Bertram, C. et al., 2015b: Complementing', 
                   'Bertram, C. et al., 2018: Targeted']}
df = pd.DataFrame(data, columns = ['Title'])
df['title2'] = df.Title.str.split(':').str[-1].str.lstrip()

print(df)

输出

0         Bertram, C. et al., 2015a: Carbon         Carbon
1  Bertram, C. et al., 2015b: Complementing  Complementing
2        Bertram, C. et al., 2018: Targeted       Targeted