Нахождение местоположения дубликата для дублированных столбцов в пандах - PullRequest
0 голосов
/ 03 июля 2018

Я знаю, что могу найти дубликаты столбцов, используя:

df.T.duplicated()

что бы я хотел знать индекс, дубликат столбца которого является дубликатом. Например, C и D являются дубликатами A ниже:

df = pd.DataFrame([[1,0,1,1], [2,0,2,2]], columns=['A', 'B', 'C', 'D'])

   A  B  C  D
0  1  0  1  1
1  2  0  2  2

Я бы хотел что-то вроде:

duplicate_index = pd.Series([None, None, 'A', 'A'], ['A', 'B', 'C', 'D'])

Ответы [ 2 ]

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

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

import pandas as pd

df = pd.DataFrame([[1,0,1,1], [2,0,2,2]], columns=['A', 'B', 'C', 'D'])

# compute the correlation matrix
cm = df.corr()
cm

enter image description here

Здесь показана матрица корреляции всех столбцов друг с другом (включая самого себя). Если столбец равен 1: 1 с другим столбцом, то значение равно 1,0.

Чтобы найти все столбцы, которые являются дубликатами A, тогда:

cm['A']

A    1.0
B    NaN 
C    1.0
D    1.0

Если у вас есть категориальные (строковые объекты), а не числовые, вы можете создать таблицу взаимной корреляции.

Надеюсь, это поможет!

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

Я не знаю, есть ли у duplicated возможность предоставить информацию о первой строке с теми же данными. Моя идея заключается в использовании groupby и transform, таких как:

arr_first = (df.T.reset_index().groupby([col for col in df.T.columns])['index']
                .transform(lambda x: x.iloc[0]).values)

В вашем примере arr_first тогда равно array(['A', 'B', 'A', 'A'], dtype=object), и поскольку они имеют тот же порядок, что и df.columns, для получения ожидаемого результата вы используете np.where, например:

duplicate_index = pd.Series(pd.np.where(arr_first != df.columns, arr_first, None),df.columns)

и результат для duplicate_index равен

A    None
B    None
C       A
D       A
dtype: object
...