Pythonデータフレームパンダはintを使用して列をドロップします


154

列をドロップするには、df.drop( 'column name'、axis = 1)を使用することを理解しています。列名の代わりに数値インデックスを使用して列を削除する方法はありますか?


私は、これはここに示されている理由のために動作しません図:stackoverflow.com/questions/13411544/...
ジョン

回答:


167

次のiようにインデックスの列を削除できます:

df.drop(df.columns[i], axis=1)

列に重複した名前がある場合、奇妙に動作する可能性があるため、これを行うには、削除する列の名前を新しい名前で変更できます。または、次のようにDataFrameを再割り当てできます。

df = df.iloc[:, [j for j, c in enumerate(df.columns) if j != i]]

4
ポイントを逃したと思います-彼らはラベルではなくインデックスでドロップしたいのです。インデックスをラベルに変換すると、ラベルごとにドロップされます:(
Darren

colsにインデックスを付ける方法(データフレームの中央で連続している100列を削除する必要がある場合)
Sai Kiran

111

次のように複数の列をドロップします。

cols = [1,2,4,5,12]
df.drop(df.columns[cols],axis=1,inplace=True)

inplace=Trueデータフレームのコピーで列を削除せずに、データフレーム自体に変更を加えるために使用されます。オリジナルをそのまま維持する必要がある場合は、以下を使用します。

df_after_dropping = df.drop(df.columns[cols],axis=1)

3
その場での議論は何ですか?
sidpat

12
使用inplace=Trueしないdf = df.drop()場合は、dfそれ自体の変化を見たい場合に使用する必要があります。
ミュオン2016

colsにインデックスを付ける方法(データフレームの中央で連続している100列を削除する必要がある場合)。
サイキラン

36

同じ名前の列が複数ある場合、ここまでの解決策ではすべての列が削除されるため、目的の列ではない可能性があります。これは、1つのインスタンスを除いて重複する列を削除しようとしている場合に発生することがあります。次の例は、この状況を明確にしています。

# make a df with duplicate columns 'x'
df = pd.DataFrame({'x': range(5) , 'x':range(5), 'y':range(6, 11)}, columns = ['x', 'x', 'y']) 


df
Out[495]: 
   x  x   y
0  0  0   6
1  1  1   7
2  2  2   8
3  3  3   9
4  4  4  10

# attempting to drop the first column according to the solution offered so far     
df.drop(df.columns[0], axis = 1) 
   y
0  6
1  7
2  8
3  9
4  10

ご覧のとおり、両方のXs列が削除されています。代替ソリューション:

column_numbers = [x for x in range(df.shape[1])]  # list of columns' integer indices

column_numbers .remove(0) #removing column integer index 0
df.iloc[:, column_numbers] #return all columns except the 0th column

   x  y
0  0  6
1  1  7
2  2  8
3  3  9
4  4  10

ご覧のとおり、これは本当に0番目の列(最初の「x」)のみを削除しました。


1
あなたは私のヒーローです。長すぎるためにこれを行う賢い方法を考えようとしていました。
ATK7474

5

データフレーム内の位置に基づいて列を識別する必要があります。たとえば、列番号2、3、および5を削除(del)する場合は、次のようになります。

df.drop(df.columns[[2,3,5]], axis = 1)

4

同じ名前の列が2つある場合。簡単な方法の1つは、次のように列の名前を手動で変更することです。

df.columns = ['column1', 'column2', 'column3']

次に、次のように、要求に応じて列インデックスを介してドロップできます。

df.drop(df.columns[1], axis=1, inplace=True)

df.column[1] インデックス1を削除します。

軸1 =列、軸0 =行を思い出してください。


3

あなたが本当に整数でそれをしたいなら(しかしなぜですか?)、あなたは辞書を作ることができます。

col_dict = {x: col for x, col in enumerate(df.columns)}

その後df = df.drop(col_dict[0], 1)、必要に応じて動作します

編集:あなたはそれをあなたのためにそれを行う関数に入れることができますが、このようにそれはあなたがそれを呼び出すたびに辞書を作成します

def drop_col_n(df, col_n_to_drop):
    col_dict = {x: col for x, col in enumerate(df.columns)}
    return df.drop(col_dict[col_n_to_drop], 1)

df = drop_col_n(df, 2)


-1

同じ名前の列が複数存在する可能性があるため、最初に列の名前を変更する必要があります。これがソリューションのコードです。

df.columns=list(range(0,len(df.columns)))
df.drop(columns=[1,2])#drop second and third columns
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.