pandas фильтр с заменой и поиском - PullRequest
1 голос
/ 20 января 2020

У меня есть такой фрейм данных

Я хочу подгонять строки и заменять значения на основе фильтра. Я хочу применить две разные операции на основе значения замены.

Как это сделать, поскольку мой текущий подход не работает.

import pandas as pd
import re

df = pd.DataFrame(data={'a': ['aa', 'bb', 'c banana a dupa'], 'b': ['\w','\d','[ab-c]','[^c b]']})

df['filter'] = (df['a'] > 2).replace({True: f"dupa {df['b']}", False: re.search(df['b'], df['a'])})

1 Ответ

2 голосов
/ 20 января 2020

Я думаю, что вы хотите numpy.where, потому что replace используется для замены на скаляры, тогда для сравнения длин используйте Series.str.len, только для значения предварительного сгиба + и для поиска используйте apply:

df = pd.DataFrame(data={'a': ['aa', 'bb', 'c banana a dupa', 'dd'], 
                        'b': ['\w','\d','[ab-c]','[^c b]']})

df['filter'] = np.where(df['a'].str.len() > 2, 
                        "dupa " + df['b'],  
                        df.apply(lambda x: re.search(x['b'], x['a']), axis=1))
print (df)

                 a       b                                     filter
0               aa      \w  <re.Match object; span=(0, 1), match='a'>
1               bb      \d                                       None
2  c banana a dupa  [ab-c]                                dupa [ab-c]
3               dd  [^c b]  <re.Match object; span=(0, 1), match='d'>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...