Выбор строк в кадре данных с использованием списка значений - PullRequest
2 голосов
/ 17 апреля 2019

У меня есть список значений, которые я хотел бы использовать для выбора строк в кадре данных. Хитрость в том, что я хотел бы выбрать любую строку, в которой значение списка находится в строке. Пример:

index    color    shape
 1       blue     star
 2       red      square
 3       yellow   circle

Мой список будет

list_vals = ['sq', 'blu']

Я бы хотел выбрать строки

index    color   shape
1        blue    star
2        red     square

Ответы [ 4 ]

3 голосов
/ 17 апреля 2019

Используйте DataFrame.stack для преобразования в Series, затем используйте Series.str.contains, чтобы найти интересующие вас строки - мы будем использовать '|'.join для создания регулярное выражение 'ИЛИ', объединяющее все элементы из list_items.

Для справки, этот шаблон регулярных выражений в данном случае выглядит как 'sq|blu'.

Далее Series.unstack, чтобы вернуться к исходной форме и использовать DataFrame.any над осью 1, чтобы создать логический индекс, который мы будем использовать для возврата нужных строк.

df[df.stack().str.contains('|'.join(list_vals)).unstack().any(1)]

[выход]

   ndex color   shape
0     1  blue    star
1     2   red  square
2 голосов
/ 17 апреля 2019

Или присоедините список к трубе и проверьте с помощью str.contains() над df:

df[df.apply(lambda x: x.str.contains('|'.join(list_vals))).any(axis=1)]

       color   shape
index              
1      blue    star
2       red  square
2 голосов
/ 17 апреля 2019
df[df['shape'].apply(lambda x: any(s in x[:len(s)] for s in list_vals))]

выход

  color   shape
1   red  square
2 голосов
/ 17 апреля 2019

Вот один подход

df_filtered = (
    df[(df['color'].str.contains(list_vals[0])) |
        (df['shape'].str.contains(list_vals[1]))
        ]
                )

print(df_filtered)
   index color   shape
0      1  blue    star
1      2   red  square

EDIT

Другой подход основан на этом посте SO (который содержит полное объяснение этого метода)

  • единственные изменения, которые я сделал, были (1) объединить ваш список поиска в одну строку поиска и (2) вернуть индекс DataFrame (строка) результатов поиска (отфильтрованных) (затем он используется для нарезки оригинал DataFrame)
def find_subtext(df, txt):
    contains = df.stack().str.contains(txt).unstack()
    return contains[contains.any(1)].index
df_filtered = find_subtext(df, '|'.join(list_vals))

print(df.iloc[df_filtered, :])
   index color   shape
0      1  blue    star
1      2   red  square
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...