Python: Подсчет количества строк, содержащих текст в диапазоне столбцов - PullRequest
1 голос
/ 01 февраля 2020

Ответы в Подсчитать количество строк, когда строка содержит определенный текст дал мне часть пути ...

Столбцы помечены "1a.", "2a." И "3a «. Каждая строка помечена уникальным идентификатором (случайная буквенная цифра c код).

Таблица

Как рассчитать, сколько строк содержат хотя бы 1 из 10 буквы в нескольких столбцах?

Этот код работает для одного столбца: len(df[df['1a.'].str.contains('A|I|M|Q|C|K|G|O|E|S')])

Я попытался использовать несколько столбцов, используя len(df[df['1a.'|'2a.'|'3a.'].str.contains('A|I|M|Q|C|K|G|O|E|S')]), и получил ошибку:


TypeError Traceback (последний вызов был последним) в ----> 1 len (df [df ['1a.' | '2a.' | '3a.']. str.contains ('A | I | M | Q | C | K | G | O | E | S ')])

Ошибка типа: неподдерживаемые типы операндов для |:' str 'и' str '

Строка должна только подсчитать один раз, содержат ли три столбца «A» и «I» и «M» (все три буквы в списке) ИЛИ «A» и «B» и «L» (последние две буквы отсутствуют в списке).

Ответы [ 2 ]

0 голосов
/ 01 февраля 2020

Поместив буквы, которые вы хотите найти, в список search_for_items, вы можете получить то, что вы хотите, в две строки

search_for_items = ['A','B','C']
boolean_series = df.apply(lambda x: bool(set(list(x)) & set(search_for_items)), axis=1)
num_of_rows = boolean_series.sum()

Объяснение :

1- Получить элементы, которые нужно найти в списке

2- Получить логическую серию, обнаружив, пересекаются ли два набора хотя бы для одного элемента. Первый набор представляет значения в строке данных. Второй набор представляет элементы, которые вы ищете.

3- Наконец, вы применяете функцию суммирования для суммирования этой серии всякий раз, когда она истинна.

Пример :

import pandas as pd

df = pd.DataFrame({ 'a1':['A','B', 'Z','D','E','F','G'],
                    'a2':['A','Q', 'C','D','E','F','G'],
                    'a3':['A','Z', 'Q','D','E','F','G']
                  })
search_for_items = ['A','B','C']
df
    a1  a2  a3
0   A   A   A
1   B   Q   Z
2   Z   C   Q
3   D   D   D
4   E   E   E
5   F   F   F
6   G   G   G

Решение:

boolean_series = df.apply(lambda x: bool(set(list(x)) & set(search_for_items)), axis=1)
num_of_rows = boolean_series.sum()
num_of_rows
3

, которое вернуло 3, как и ожидалось, поскольку первые три строки в кадре данных содержится A или B или C.

0 голосов
/ 01 февраля 2020

Вы можете использовать логическую операцию в 2 столбцах, используя & и |, например:

df[df['1a.'].str.contains('A|I|M|Q|C|K|G|O|E|S')] | df[df[|'2a.'].str.contains('A|I|M|Q|C|K|G|O|E|S')] | df[df['3a.'].str.contains('A|I|M|Q|C|K|G|O|E|S')]

Логическая операция в двух столбцах кадра данных

Таким образом, полный ответ будет:

(df[df['1a.'].str.contains('A|I|M|Q|C|K|G|O|E|S')] | df[df[|'2a.'].str.contains('A|I|M|Q|C|K|G|O|E|S')] | df[df['3a.'].str.contains('A|I|M|Q|C|K|G|O|E|S')]).value_counts()[True]

...