gpt4 book ai didi

python - Pandas ,删除最后一个 '_' 之后的所有内容

转载 作者:行者123 更新时间:2023-12-05 08:26:01 24 4
gpt4 key购买 nike

我的专栏中有以下类型的字符串,如下所示。我想解析每个字符串的最后一个 _ 之后的所有内容,如果没有 _ 则保留字符串原样。 (因为我下面的尝试只会排除没有 _ 的字符串)

到目前为止,我已经在下面尝试过,在这里看到: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

预期:

Stackoverflow
Stack_Over_Flow
Stackoverflow
Stack_Overflow

如有任何帮助,我们将不胜感激。

最佳答案

结合使用 str.rsplitstr.get 以获得您想要的结果。 str.rsplit 只是从末尾拆分字符串,而 str.get 获取 pd.Series 对象中迭代器的第 n 个元素。


回答

d6['SOURCE_NAME'] = df['SOURCE_NAME'].str.rsplit('_', n=1).str.get(0)

rsplit 中的 n 参数限制了输出中的分割数,因此您只保留最后一个 '_' 之前的所有内容。

尽管使用 pd.Series.apply 的解决方案几乎快了一半,但我还是喜欢这个解决方案,因为它的语法更具表现力。如果你想使用 pd.Series.apply 解决方案(更快)检查计时部分!

pandas documentation .


例子

strs = ['Stackoverflow_1234',
'Stack_Over_Flow_1234',
'Stackoverflow',
'Stack_Overflow_1234']
df = pd.DataFrame(data={'SOURCE_NAME': strs})

这导致

print(df)
SOURCE_NAME
0 Stackoverflow_1234
1 Stack_Over_Flow_1234
2 Stackoverflow
3 Stack_Overflow_1234

使用建议的解决方案:

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

时间

有趣的是,使用 pd.Series.str 不一定比使用 pd.Series.apply 快:

import pandas as pd

df = pd.DataFrame(data={'SOURCE_NAME': ['stackoverflow_1234_abcd'] * 1000})

%timeit df['SOURCE_NAME'].apply(lambda x: x.rsplit('_', 1)[0])
497 µs ± 30.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit df['SOURCE_NAME'].str.rsplit('_', n=1).str.get(0)
1.04 ms ± 4.27 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

# increasing the number of rows x 100
df = pd.concat([df] * 100)

%timeit df['SOURCE_NAME'].apply(lambda x: x.rsplit('_', 1)[0])
31.7 ms ± 1.5 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit df['SOURCE_NAME'].str.rsplit('_', n=1).str.get(0)
84.1 ms ± 6.88 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

关于python - Pandas ,删除最后一个 '_' 之后的所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58738734/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com