我在下面看到的列中有以下类型的字符串。我想解析_
每个字符串的最后一个之后的所有内容,如果没有,_
则保留字符串原样。(因为我下面的尝试只会排除没有 no 的字符串_
)
到目前为止,我已经在下面尝试过,在这里看到:Python pandas: remove everything after a delimiter in a string。但它只是在第一次之后解析出所有内容_
d6['SOURCE_NAME'] = d6['SOURCE_NAME'].str.split('_').str[0]
以下是我的 SOURCE_NAME 列中的一些示例字符串。
Stackoverflow_1234
Stack_Over_Flow_1234
Stackoverflow
Stack_Overflow_1234
Run Code Online (Sandbox Code Playgroud)
预期的:
Stackoverflow
Stack_Over_Flow
Stackoverflow
Stack_Overflow
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激。
使用的组合str.rsplit
,并str.get
为您所期望的结果。str.rsplit
简单地从末尾分割一个字符串,同时str.get
获取 pd.Series 对象中迭代器的第 n 个元素。
d6['SOURCE_NAME'] = df['SOURCE_NAME'].str.rsplit('_', n=1).str.get(0)
中的n
参数rsplit
限制输出中的拆分次数,以便您只保留最后一个“_”之前的所有内容。
尽管使用的解决方案pd.Series.apply
几乎快一半,但我喜欢这个解决方案,因为它的语法更具表现力。如果您想使用pd.Series.apply
解决方案(更快),请检查计时部分!
strs = ['Stackoverflow_1234',
'Stack_Over_Flow_1234',
'Stackoverflow',
'Stack_Overflow_1234']
df = pd.DataFrame(data={'SOURCE_NAME': strs})
Run Code Online (Sandbox Code Playgroud)
这导致
print(df)
SOURCE_NAME
0 Stackoverflow_1234
1 Stack_Over_Flow_1234
2 Stackoverflow
3 Stack_Overflow_1234
Run Code Online (Sandbox Code Playgroud)
使用建议的解决方案:
print(df)
SOURCE_NAME
0 Stackoverflow_1234
1 Stack_Over_Flow_1234
2 Stackoverflow
3 Stack_Overflow_1234
Run Code Online (Sandbox Code Playgroud)
有趣的是, usingpd.Series.str
不一定比 using 快pd.Series.apply
:
df['SOURCE_NAME'].str.rsplit('_', 1).str.get(0)
0 Stackoverflow
1 Stack_Over_Flow
2 Stackoverflow
3 Stack_Overflow
Name: SOURCE_NAME, dtype: object
Run Code Online (Sandbox Code Playgroud)