Найти все повторяющиеся столбцы в коллекции фреймов данных - PullRequest
0 голосов
/ 02 июля 2018

Имея коллекцию фреймов данных, цель состоит в том, чтобы идентифицировать дублированные имена столбцов и вернуть их в виде списка.

Пример

В качестве входных данных используются 3 кадра данных df1, df2 и df3:

df1 = pd.DataFrame({'a':[1,5], 'b':[3,9], 'e':[0,7]})

   a  b  e
0  1  3  0
1  5  9  7

df2 = pd.DataFrame({'d':[2,3], 'e':[0,7], 'f':[2,1]})

   d  e  f
0  2  0  2
1  3  7  1

df3 = pd.DataFrame({'b':[3,9], 'c':[8,2], 'e':[0,7]})

   b  c  e
0  3  8  0
1  9  2  7

Вывод списка [b, e]

1 Ответ

0 голосов
/ 02 июля 2018

pd.Series.duplicated

Поскольку вы используете Pandas, вы можете использовать pd.Series.duplicated после объединения имен столбцов:

# concatenate column labels
s = pd.concat([df.columns.to_series() for df in (df1, df2, df3)])

# keep all duplicates only, then extract unique names
res = s[s.duplicated(keep=False)].unique()

print(res)
array(['b', 'e'], dtype=object)

pd.Series.value_counts

В качестве альтернативы, вы можете извлечь серию отсчетов и идентифицировать строки с числом, превышающим 1:

s = pd.concat([df.columns.to_series() for df in (df1, df2, df3)]).value_counts()

res = s[s > 1].index

print(res)
Index(['e', 'b'], dtype='object')

collections.Counter

Классическим решением Python является использование collections.Counter с последующим пониманием списка. Напомним, что list(df) возвращает столбцы в кадре данных, поэтому мы можем использовать эти map и itertools.chain, чтобы создать итерацию для подачи Counter.

from itertools import chain
from collections import Counter

c = Counter(chain.from_iterable(map(list, (df1, df2, df3))))

res = [k for k, v in c.items() if v > 1]
...