Как да премахнете колони с дублиращи се стойности във всички редове в pandas

Бих искал да премахна от моята рамка с данни колони с дублирани стойности във всички редове.

Имам рамка от данни като тази:

test =     [('a', 1, 'a', 34, 'b', 34,'a'),
                ('a', 1, 'a', 30, 'v', 30,'a'),
                ('a', 1, 'a', 16, 'a', 16,'a'),
                ('a', 1, 'a', 30, 'a', 30,'a'),
                ('a', 1, 'a', 30, 'v', 30,'a'),
                ('a', 1, 'a', 30, 'd', 30,'a'),
                ('a', 1, 'a', 40, 'a', 40,'a'),
                ('a', 1, 'a', 30, 'a', 30,'a')
                ]
test_df = pd.DataFrame(test, columns=['col1', 'col2', 'col3', 'col4', 'col5', 'col6', 'col7'])

Както виждате колони: col1, col3, col4, col6, col7 имат дублиращи се стойности във всички редове и моят изключен изход трябва да бъде рамка с данни без дублиращи се колони. За да бъда по-точен, бих искал да запазя само една от дублиращите се колони, може да бъде напр. col1 и col4


person data_b77    schedule 26.06.2019    source източник
comment
Видях drop_duplicates, но работи за редове и няма аргумент за ос. Има ли може би аналог на тази функция за колони?   -  person data_b77    schedule 26.06.2019


Отговори (1)


Първо транспонирайте, след това премахнете дубликатите за всички редове и последно транспонирайте обратно:

test_df = test_df.T.drop_duplicates().T
print (test_df)
  col1 col2 col4 col5
0    a    1   34    b
1    a    1   30    v
2    a    1   16    a
3    a    1   30    a
4    a    1   30    v
5    a    1   30    d
6    a    1   40    a
7    a    1   30    a

Друго решение е преобразуване на колона в кортежи, извикване на Series.duplicated и филтрирайте по DataFrame.loc с обратна маска с ~ и boolean indexing:

test_df = test_df.loc[:, ~test_df.apply(tuple).duplicated()]
person jezrael    schedule 26.06.2019