Python Dataframe通过搜索子字符串对列内容进行切片

Python Dataframe通过搜索子字符串对列内容进行切片,python,dataframe,Python,Dataframe,下面是一个数据框,我想得到第一个“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) 考虑使用查找和切片,因此进行了以下两次尝试,但均无效: df['where_i'] = df

下面是一个数据框,我想得到第一个“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)
考虑使用查找和切片,因此进行了以下两次尝试,但均无效:

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]
如何通过搜索关键字将其切分?多谢各位


您可以定义一个小的正则表达式检查函数,并将其应用到您的列中

例如:

重新导入
def get_匹配项(正则表达式,字符串):
matches=re.search(正则表达式、字符串、re.IGNORECASE)
如果匹配:
返回匹配项。组()
一无所获
然后会回来

0      Di
1    None
2      li
3      ri
4    None
5      ri
6    None
Name: Name, dtype: object

您想要的是模棱两可的,因为名字
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  

关于您尝试的代码,Pandas实际上提供了一个字符串切片方法:。不幸的是,在这里使用会有点尴尬

但是,使用正则表达式可以得到一个简单的解决方案:

重新导入
作为pd进口熊猫
数据={'Name':[“Diya.K”,“Kate.N”,“Ali.T”,“Beatriz.C”,“Andy.W”,“Gabriel.P”,“Peter.V”],
“售出单位”:[48、58、20、41、21、14、22]}
df=pd.DataFrame(数据)
字母_re=r“(.i)”
df[“sub_slice”]=df[“Name”].str.extract(字母re,flags=re.IGNORECASE,expand=False)
打印(df)
输出:

命名已售出的子单元
0第亚K 48第二
1凯特北58南
2.阿里T 20里
3比阿特丽兹C 41国际扶轮
4.W 21南
5加布里埃尔,第14页
6彼得对22南

为什么
姓名的
通缉
栏中没有结果?@AMC,谢谢您指出。)你能将表格作为实际文本共享吗?请参阅:,.@AMC,它们是来自2次尝试片段的“打印”输出。为了更好的说明,我将它们与代码一起制作了屏幕截图。
df['where'][I]
不会产生警告吗?这样索引的正确方法是使用
loc
iloc
。我认为您也不需要事先创建列。不,它没有给出任何警告,我认为这是因为dataFrame的创建方式。是的,你们是对的,并没有必要事先创建专栏。我已对我的代码进行了更改。@Harpreethingh,感谢您的帮助和分享!它起作用了!您介意我选择AMC作为答案吗?
如果len(matches)==0:
可以简化为
如果不匹配:
。另外,如果您只关心第一个结果,为什么要使用
re.findall()
?这不是
re.search()
的目的吗?谢谢@AMC的有效评论。修改答案谢谢您的持续跟进!你介意我选择另一个答案吗?哪一个可行,来得更早,也很直接?@MarkK你指的是哪一个?我很快地看了一些答案,但它们似乎很简单,过于复杂,这就是我共享此解决方案的原因。@MarkK
NaN
是完全正常的,这是表示缺少值的惯用方式。@MarkK再看一眼,我对他们的解决方案的性能很好奇,尤其是
str.find()
对每个值调用3次。明天我将对解决方案进行基准测试,并包括一个经过重构的循环+字符串切片方法,该方法应该更有效。
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