Извлечение данных, содержащих определенный символ, с помощью панд - PullRequest
0 голосов
/ 30 октября 2018

Я хотел бы извлечь данные, содержащие определенную строку символов в другом столбце.

Например, извлеченная цель похожа на символ «другая строка столбца + 3 цифры».
Это ошибка. Я хотел бы получить строку TARGET.

df = pd.DataFrame({'col1':['xxxx', 'yyyy', 'zzzz'],'col2':['xxxx123','yyyy1234','aaa123']})

col1 | col2
xxxx | xxxx123 <- TARGET 
yyyy | yyyy1234  <- Not TARGET
zzzz | aaaa123  <- Not TARGET

Это мой код, который не работает.

print(df[df['col1'].str.match(df['col2'] + [0-9][0-9][0-9])])

Я пробовал str.contains, str.match и isin. Вероятно, я не понимаю, как их использовать.

Пожалуйста, дайте мне знать, как это сделать.

Ответы [ 3 ]

0 голосов
/ 30 октября 2018

Вы можете фильтровать по пересечению двух логических масок:

n = 3  # number of digits
mask1 = pd.to_numeric(df['col2'].str[-n:], errors='coerce').notnull()
mask2 = [col2[:-n] == col1 for col1, col2 in zip(df['col1'], df['col2'])]

df_slice = df[mask1 & mask2]

print(df_slice)

   col1     col2
0  xxxx  xxxx123

Сравнительный анализ производительности

Вы, вероятно, найдете регулярное выражение дороже, чем обычные str операции. В настоящее время методы Pandas str также эффективны.

df = pd.DataFrame({'col1':['xxxx', 'yyyy', 'zzzz'],'col2':['xxxx123','yyyy1234','aaa123']})

def vai(df):
    cond1 = df.col2.str.extract('([A-Za-z]+)\d', expand = False).eq(df.col1)
    cond2 = df.col2.str.extract('[A-Za-z](\d{3})$', expand = False)
    return cond1 & cond2

def jpp(df):
    n = 3  # number of digits
    mask1 = pd.to_numeric(df['col2'].str[-n:], errors='coerce').notnull()
    mask2 = [col2[:-n] == col1 for col1, col2 in zip(df['col1'], df['col2'])]
    return mask1 & mask2


def jpp2(df):
    n = 3  # number of digits
    mask1 = pd.to_numeric(df['col2'].str[-n:], errors='coerce').notnull()
    mask2 = df['col2'].str[:-n] == df['col1']
    return mask1 & mask2

df = pd.concat([df]*1000)

assert vai(df).equals(jpp(df)) and vai(df).equals(jpp2(df))

%timeit vai(df)   # 17.3 ms per loop
%timeit jpp(df)   # 5.4 ms per loop
%timeit jpp2(df)  # 8.01 ms per loop
0 голосов
/ 30 октября 2018

Два совпадения с шаблоном и фильтрация кадра данных

cond1 = df.col2.str.extract('([A-Za-z]+)\d', expand = False).eq(df.col1)
cond2 = df.col2.str.extract('[A-Za-z](\d{3})$', expand = False)

df[(cond1) & (cond2)]

    col1    col2
0   xxxx    xxxx123@gmail.com
0 голосов
/ 30 октября 2018

Вы можете написать функцию, которая выполняет сопоставление строк или использует регулярные выражения, и передать ее в метод apply () .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...