Кадр данных, чтобы разделить содержимое столбца путем поиска в подстроке - PullRequest
1 голос
/ 26 февраля 2020

Ниже приведен кадр данных, и я хочу получить первое «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 ]

2 голосов
/ 26 февраля 2020

Что касается кода, который вы пробовали, 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
0 голосов
/ 26 февраля 2020

То, что вы хотите, неоднозначно, потому что имя 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  
0 голосов
/ 26 февраля 2020

Вы можете определить небольшую функцию проверки регулярных выражений и 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...