数据框通过搜索子字符串来切片列内容

时间:2020-02-26 02:26:52

标签: 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)

想使用查找和切片,因此进行了以下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]

如何通过搜索关键字对其进行切片?谢谢。

enter image description here

3 个答案:

答案 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