Фильтр панд по нескольким «содержит» не для одной ячейки, а для всего столбца - PullRequest
0 голосов
/ 26 января 2019

У меня есть куча фреймов данных, и я хочу найти фреймы данных, которые содержат оба слова, которые я указываю. Например, я хочу найти все кадры данных, которые содержат слова hello и world. A & B будет квалифицироваться, C не будет.

Я пробовал: df[(df[column].str.contains('hello')) & (df[column].str.contains('world'))], который поднимает только B и df[(df[column].str.contains('hello')) | (df[column].str.contains('world'))], который поднимает все три.

Мне нужно что-то, что выбирает только A & B

A =

    Name    Data   
0   Mike    hello    
1   Mike    world    
2   Mike    hello   
3   Fred    world
4   Fred    hello
5   Ted     world

B =

    Name    Data   
0   Mike    helloworld
1   Mike    world    
2   Mike    hello   
3   Fred    world
4   Fred    hello
5   Ted     world

C =

    Name    Data   
0   Mike    hello
1   Mike    hello    
2   Mike    hello   
3   Fred    hello
4   Fred    hello
5   Ted     hello

Ответы [ 3 ]

0 голосов
/ 26 января 2019

Использование

import re 

bool(re.search(r'^(?=.*hello)(?=.*world)', df.sum().sum())
Out[461]: True
0 голосов
/ 26 января 2019

Если hello и world являются автономными строками в ваших данных, df.eq () должен выполнить эту работу, и вам не нужен str.contains.Это не строковый метод, он работает на всем фрейме данных.

(((df == 'hello').any()) & ((df == 'world').any())).any()

True
0 голосов
/ 26 января 2019

Требуется одно значение bool, если 'hello' находится где-либо, а 'world' находится в любом столбце:

df.Data.str.contains('hello').any() & df.Data.str.contains('world').any()

Если у вас есть список слов и вам нужно проверить весь текст DataFrame, попробуйте:

import numpy as np

lst = ['hello', 'world']
np.logical_and.reduce([any(word in x for x in df.values.ravel()) for word in lst])

Пример данных

print(df)
   Name   Data   Data2
0  Mike  hello  orange
1  Mike  world  banana
2  Mike  hello  banana
3  Fred  world  apples
4  Fred  hello   mango
5   Ted  world    pear

lst = ['apple', 'hello', 'world']
np.logical_and.reduce([any(word in x for x in df.values.ravel()) for word in lst])
#True

lst = ['apple', 'hello', 'world', 'bear']
np.logical_and.reduce([any(word in x for x in df.values.ravel()) for word in lst])
# False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...