如何根据不同的字符(例如'/ - )从数据帧中切割字符串,从左开始。 ,我只想第一次出现这个角色。
key name
1 McDonald's
2 CVS/PHARMACY
3 CVS/Store
4 WAL-MART
5 AMAZON.CO
期待结果:
key name for_Group
1 McDonald's McDonald
2 CVS/PHARMACY CVS
3 CVS/Store CVS
4 WAL-MART WAL
5 AMAZON.CO AMAZON
我不确定这是否需要使用正则表达式?
答案 0 :(得分:4)
选项1
使用 str.split
expand=True
df['for_group'] = df.name.str.split(r"[\'\/\-\.]", expand=True)[0]
key name for_group
0 1 McDonald's McDonald
1 2 CVS/PHARMACY CVS
2 3 CVS/Store CVS
3 4 WAL-MART WAL
4 5 AMAZON.CO AMAZON
选项2 (最佳选择)
str.extract
(我个人更喜欢这个,它会匹配,直到找到您想要的停止字符之一)
df.name.str.extract(r'(.*?)[\'\/\-\.]', expand=False)
0 McDonald
1 CVS
2 CVS
3 WAL
4 AMAZON
这里的第二个选择要快得多:
df = pd.concat([df]*10000)
%timeit df.name.str.split(r"[\'\/\-\.]", expand=True)[0]
141 ms ± 1.8 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit df.name.str.extract(r'(.*)[\'\/\-\.]', expand=False)
72.6 ms ± 397 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
答案 1 :(得分:2)
方法1
您可以使用以下正则表达式,这意味着重复一次或多次单词字符(a-z等)。这将返回一个数组,您可以从中获取第一个元素。
import re
df['for_group'] = df['name'].apply(lambda x: re.findall(r"[\w]+", x)[0])
更快的正则表达式方法是使用{user3483203指出的.search()
df['for_group'] = df['name'].apply(lambda x: re.search(r"[\w]+", x).group())
方法2
同样,您可以使用:
df['for_group'] = df.name.str.split('\W+').apply(lambda x: x[0])
输出:
key name for_group
0 1 McDonald's McDonald
1 2 CVS/PHARMACY CVS
2 3 CVS/Store CVS
3 4 WAL-MART WAL
4 5 AMAZON.CO AMAZON