Подтвердить что ты не робот

Как выбрать и удалить столбцы с дублирующимся именем в pandas DataFrame

У меня огромный DataFrame, где некоторые столбцы имеют одинаковые имена. Когда я пытаюсь выбрать столбец, который существует дважды (например, del df['col name'] или df2=df['col name']), я получаю сообщение об ошибке. Что я могу сделать?

4b9b3361

Ответ 1

Вы можете указывать столбцы по индексу:

>>> df = pd.DataFrame([[1,2],[3,4],[5,6]], columns=['a','a'])
>>> df
   a  a
0  1  2
1  3  4
2  5  6
>>> df.iloc[:,0]
0    1
1    3
2    5

Или вы можете переименовывать столбцы, например

>>> df.columns = ['a','b']
>>> df
   a  b
0  1  2
1  3  4
2  5  6

Ответ 2

Это не очень хорошая ситуация. Лучше всего было бы создать иерархическую схему маркировки столбцов (Pandas допускает многоуровневую маркировку столбцов или метки индексов строк). Определите, что это значит, что два разных столбца, которые имеют одинаковое имя, действительно отличаются друг от друга и используют это для создания индекса иерархической колонки.

В то же время, если вы знаете позиционное расположение столбцов в упорядоченном списке столбцов (например, от dataframe.columns), вы можете использовать многие из явных функций индексации, таких как .ix[] или .iloc[] для получения значений из столбца позиционно.

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

dataframe["new_name"] = data_frame.ix[:, column_position].values

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

Они могут не работать для вас, если данные слишком велики. Лучше всего найти способ изменения процесса построения, чтобы получить индекс иерархического столбца.

Ответ 3

Другое решение:

def remove_dup_columns(frame):
     keep_names = set()
     keep_icols = list()
     for icol, name in enumerate(frame.columns):
          if name not in keep_names:
               keep_names.add(name)
               keep_icols.append(icol)
     return frame.iloc[:, keep_icols]

import numpy as np
import pandas as pd

frame = pd.DataFrame(np.random.randint(0, 50, (5, 4)), columns=['A', 'A', 'B', 'B'])

print(frame)
print(remove_dup_columns(frame))

Выходной сигнал

    A   A   B   B
0  18  44  13  47
1  41  19  35  28
2  49   0  30  16
3  39  29  43  41
4  26  19  48  13
    A   B
0  18  13
1  41  35
2  49  30
3  39  43
4  26  48

Ответ 4

Следующая функция удаляет столбцы с именами дубликатов и сохраняет только одну. Не совсем то, что вы просили, но вы можете использовать его, чтобы решить вашу проблему. Идея состоит в том, чтобы вернуть индексные номера, а затем вы можете напрямую указать конкретные индексы столбцов. Индексы уникальны, а имена столбцов не являются

def remove_multiples(df,varname):
    """
    makes a copy of the first column of all columns with the same name,
    deletes all columns with that name and inserts the first column again
    """
    from copy import deepcopy
    dfout = deepcopy(df)
    if (varname in dfout.columns):
        tmp = dfout.iloc[:, min([i for i,x in enumerate(dfout.columns == varname) if x])]
        del dfout[varname]
        dfout[varname] = tmp
    return dfout

где

[i for i,x in enumerate(dfout.columns == varname) if x]

- часть, в которой вы нуждаетесь