Подсчитать количество строк DataFrame, которые содержат все значения из списка, используя pandas - PullRequest
1 голос
/ 20 марта 2020

Я хочу посчитать количество строк DataFrame , которое содержит все значений из списка.

Допустим, у меня есть:

abc = pd.DataFrame(np.random.randint(1,100,(100, 10)))

и у меня есть следующий список (с уникальными значениями):

x = [10, 32, 8]

Какой самый простой способ, используя pandas, проверить, содержит ли строка все заданные значения ? Я мог бы, вероятно, преобразовать каждую строку в список, а затем сравнить содержимое нового списка с заданным списком и увеличить счетчик при успешном сравнении, но я полагаю, что это не самый быстрый способ в этом случае ...

Ответы [ 4 ]

2 голосов
/ 20 марта 2020

необходимо замаскировать дубликаты, тогда мы можем использовать DataFrame.isin и DataFrame.sum, чтобы подсчитать количество совпадений в строке и проверить, больше или равно на длину списка с DataFrame.ge, что будет достаточно, поскольку дубликатов нет. наконец, мы получаем сумму строк, которые удовлетворяют этому условию

df=pd.DataFrame(np.sort(abc, axis=1))
df.where(df.ne(df.shift(axis=1))).isin(x).sum(axis=1).ge(len(x)).sum()

Если нет дубликатов в строках:

abc.isin(x).sum(axis=1).ge(len(x)).sum()

Ссылки на дубликаты маски:

1 голос
/ 20 марта 2020

Что-то вроде

abc.apply(lambda y : pd.Series(x).isin(y).all(), axis=1).sum()
4
0 голосов
/ 20 марта 2020

Вы можете использовать numpy setdiff массива и строки, если len равен нулю, присутствуют все элементы.

abc.apply(lambda row: len(np.setdiff1d(x, row)) == 0, axis = 1)
0 голосов
/ 20 марта 2020

Вы можете сделать:

# in case x is not unique
# x=set(x)

df=abc.stack().reset_index(level=1, drop=True).reset_index().drop_duplicates().rename(columns={0: "num"})

cnt=df.loc[df["num"].isin(x)].groupby("index")["num"].count().eq(len(x)).sum()

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