熊猫,删除最后一个“_”之后的所有内容

exc*_*guy 2 python pandas

我在下面看到的列中有以下类型的字符串。我想解析_每个字符串的最后一个之后的所有内容,如果没有,_则保留字符串原样。(因为我下面的尝试只会排除没有 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)

任何帮助,将不胜感激。

Man*_*nez 5

使用的组合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)