Пересечение двух или более столбцов DataFrame - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь найти пересечение трех фреймов данных, однако pd.intersect1d не любит использовать три фрейма данных.

import numpy as np
import pandas as pd
df1 = pd.DataFrame(np.random.randint(0,10,size=(10, 4)), columns=list('ABCD'))
df2 = pd.DataFrame(np.random.randint(0,10,size=(10, 4)), columns=list('BCDE'))
df3 = pd.DataFrame(np.random.randint(0,10,size=(10, 4)), columns=list('CDEF'))

inclusive_list = np.intersect1d(df1.columns, df2.columns, df3.columns)

Ошибка:

ValueError: The truth value of a Index is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

inclusive_list должен включать только имена столбцов C & D. Любая помощь будет принята. Спасибо.

Ответы [ 3 ]

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

Почему ваш текущий подход не работает :

intersect1d не принимает N массивов, он сравнивает только 2.

numpy.intersect1d(ar1, ar2, assume_unique=False, return_indices=False)

Из определения видно, что вы передаете третий массив как параметр assume_unique, и, поскольку вы обрабатываете массив как один логический тип, вы получаете ValueError.


Вы можете расширить функциональность intersect1d для работы с N массивами, используя functools.reduce:

from functools import reduce
reduce(np.intersect1d, (df1.columns, df2.columns, df3.columns))

array(['C', 'D'], dtype=object)

Лучший подход

Однако самый простой подход - просто использовать пересечение для объекта Index:

df1.columns & df2.columns & df3.columns

Index(['C', 'D'], dtype='object')
0 голосов
/ 09 января 2019

Вы можете использовать concat

pd.concat([df1.head(1),df2.head(1),df3.head(1)],join='inner').columns
Out[81]: Index(['C', 'D'], dtype='object')
0 голосов
/ 09 января 2019
inclusive_list = np.intersect1d(np.intersect1d(df1.columns, df2.columns), df3.columns)

Обратите внимание, что аргументы, передаваемые np.intersect1d (https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.intersect1d.html), должны быть двумя массивами ( ar1 и ar2 ).

Передача 3-х массивов означает, что переменная accept_unique внутри функции устанавливается как массив (ожидается, что это будет bool).

Вы также можете использовать простые методы набора Python, если вы не хотите использовать numpy

inclusive_list = set(df1.columns).intersection(set(df2.columns)).intersection(set(df3.columns))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...