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
缺少相关问题
我仔细查看了 re
和 panda
的 replace
的文档,但有些不对劲。 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
我有一个庞大的数据库,我要从中删除各种长度的前导文本。这是一个最小的工作示例:
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
缺少相关问题
我仔细查看了 re
和 panda
的 replace
的文档,但有些不对劲。 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