私は巨大なDataFrame
を持っており、いくつかの列は同じ名前を持っています。 2回存在する列を選択しようとすると、(たとえば、del df['col name']
またはdf2=df['col name']
)エラーが発生します。私に何ができる?
インデックスで列をアドレス指定できます。
>>> 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
別の解決策:
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
これは適切な状況ではありません。階層的な列ラベル付けスキームを作成するのが最善です(Pandasではマルチレベルの列ラベル付けまたは行インデックスラベルが可能です)。同じ名前の2つの異なる列が実際に互いに異なる原因を特定し、それを利用して階層列インデックスを作成します。
それまでの間、列の順序付きリスト内の列の位置がわかっている場合(たとえば、dataframe.columns
から)、.ix[]
や.iloc[]
などの明示的なインデックス機能の多くを使用して、列から位置的に値を取得できます。
次のような新しい名前で列のコピーを作成することもできます。
dataframe["new_name"] = data_frame.ix[:, column_position].values
ここで、column_position
は、取得しようとしている列のpositionalの場所を参照します(名前ではありません)。
ただし、データが大きすぎる場合、これらは機能しない可能性があります。したがって、階層列インデックスを取得するように構築プロセスを変更する方法を見つけるのが最善です。
次の関数は、重複する名前の列を削除し、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]
必要な部分です