web-dev-qa-db-ja.com

pandas DataFrameで名前が重複している列を選択して削除する方法

私は巨大なDataFrameを持っており、いくつかの列は同じ名前を持っています。 2回存在する列を選択しようとすると、(たとえば、del df['col name']またはdf2=df['col name'])エラーが発生します。私に何ができる?

16
user3107640

インデックスで列をアドレス指定できます。

>>> 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
14
Roman Pekar

別の解決策:

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
leitungswasser

これは適切な状況ではありません。階層的な列ラベル付けスキームを作成するのが最善です(Pandasではマルチレベルの列ラベル付けまたは行インデックスラベルが可能です)。同じ名前の2つの異なる列が実際に互いに異なる原因を特定し、それを利用して階層列インデックスを作成します。

それまでの間、列の順序付きリスト内の列の位置がわかっている場合(たとえば、dataframe.columnsから)、.ix[].iloc[]などの明示的なインデックス機能の多くを使用して、列から位置的に値を取得できます。

次のような新しい名前で列のコピーを作成することもできます。

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

ここで、column_positionは、取得しようとしている列のpositionalの場所を参照します(名前ではありません)。

ただし、データが大きすぎる場合、これらは機能しない可能性があります。したがって、階層列インデックスを取得するように構築プロセスを変更する方法を見つけるのが最善です。

4
ely

次の関数は、重複する名前の列を削除し、1つだけを保持します。正確にはあなたが求めていたものではありませんが、あなたはそれの断片を使ってあなたの問題を解決することができます。アイデアはインデックス番号を返すことであり、それからあなたは特定の列インデックスに直接対処することができます。インデックスは一意ですが、列名は一意ではありません

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]

必要な部分です

1
horseshoe