下面是一个数据框,我想获得第一个“ i”和一个字母。
import pandas as pd
data = {'Name': ["Diya.K","Kate.N","Ali.T","Beatriz.C","Andy.W","Gabriel.P","Peter.V"],
'Units sold' : [48,58,20,41,21,14,22]}
df = pd.DataFrame(data)
想使用查找和切片,因此进行了以下2次尝试,但均无济于事:
df['where_i'] = df['Name'].str.find('i')
df['a_letter_before_and_i'] = df['Name'].str[df['where_i'] - 1 : df['where_i'] + 1]
where_i = df['Name'].str.find('i')
df['a_letter_before_and_i'] = df['Name'].str[where_i - 1 : where_i + 1]
如何通过搜索关键字对其进行切片?谢谢。
答案 0 :(得分:2)
关于您尝试的代码,Pandas实际上提供了字符串切片方法:pandas.Series.str.slice()
。不幸的是,在这里使用它会有点尴尬。
但是,使用正则表达式会带来一个不错的简单解决方案:
import re
import pandas as pd
data = {'Name': ["Diya.K", "Kate.N", "Ali.T", "Beatriz.C", "Andy.W", "Gabriel.P", "Peter.V"],
'Units sold': [48, 58, 20, 41, 21, 14, 22]}
df = pd.DataFrame(data)
letter_re = r"(.i)"
df["sub_slice"] = df["Name"].str.extract(letter_re, flags=re.IGNORECASE, expand=False)
print(df)
输出:
Name Units sold sub_slice
0 Diya.K 48 Di
1 Kate.N 58 NaN
2 Ali.T 20 li
3 Beatriz.C 41 ri
4 Andy.W 21 NaN
5 Gabriel.P 14 ri
6 Peter.V 22 NaN
答案 1 :(得分:0)
您可以定义一个小的正则表达式检查功能,并将其apply
插入列中。
例如:
import re
def get_matches(regex, string):
matches = re.search(regex, string, re.IGNORECASE)
if matches:
return matches.group()
return None
df['Name'].apply(lambda elt : get_matches('.i', elt))
然后会返回
0 Di
1 None
2 li
3 ri
4 None
5 ri
6 None
Name: Name, dtype: object
答案 2 :(得分:0)
您想要的内容是模棱两可的,因为名字Diya
也应加上Di
但是根据我的理解,下面是代码。
df['where'] = df['Name'].map(lambda name: name[ name.find('i') -1 : name.find('i') + 1 ] if name.find('i') != -1 else '' )
print(df)
Name Units sold where
0 Diya.K 48 Di
1 Kate.N 58
2 Ali.T 20 li
3 Beatriz.C 41 ri
4 Andy.W 21
5 Gabriel.P 14 ri
6 Peter.V 22