1. ホーム
  2. python

[解決済み] Pandasのカラム名に基づく複数カラムの削除

2022-09-27 15:48:11

質問

あるデータをインポートしたところ、以下のような不要な列ができました。これらをすべて削除する簡単な方法を探しています。

   'Unnamed: 24', 'Unnamed: 25', 'Unnamed: 26', 'Unnamed: 27',
   'Unnamed: 28', 'Unnamed: 29', 'Unnamed: 30', 'Unnamed: 31',
   'Unnamed: 32', 'Unnamed: 33', 'Unnamed: 34', 'Unnamed: 35',
   'Unnamed: 36', 'Unnamed: 37', 'Unnamed: 38', 'Unnamed: 39',
   'Unnamed: 40', 'Unnamed: 41', 'Unnamed: 42', 'Unnamed: 43',
   'Unnamed: 44', 'Unnamed: 45', 'Unnamed: 46', 'Unnamed: 47',
   'Unnamed: 48', 'Unnamed: 49', 'Unnamed: 50', 'Unnamed: 51',
   'Unnamed: 52', 'Unnamed: 53', 'Unnamed: 54', 'Unnamed: 55',
   'Unnamed: 56', 'Unnamed: 57', 'Unnamed: 58', 'Unnamed: 59',
   'Unnamed: 60'

0-indexingでインデックスされているので、以下のようなものを試してみました。

    df.drop(df.columns[[22, 23, 24, 25, 
    26, 27, 28, 29, 30, 31, 32 ,55]], axis=1, inplace=True)

しかし、これはあまり効率的ではありません。私はいくつかのforループを書いてみましたが、これはPandasの悪い動作だと思いました。それゆえ、私はここで質問しているのです。

私は似たようないくつかの例を見てきました( 複数カラムのドロップ pandas ) を見ましたが、これは私の質問には答えていません。

どのように解決するのですか?

非効率的というのがどういう意味かわかりませんが、タイピングという意味であれば、興味のあるcolを選択してdfに代入し直す方が簡単かもしれませんね。

df = df[cols_of_interest]

ここで cols_of_interest は気になるカラムのリストです。

あるいは、カラムをスライスして、これを drop :

df.drop(df.ix[:,'Unnamed: 24':'Unnamed: 60'].head(0).columns, axis=1)

の呼び出しは head を呼び出すと、データではなくカラム名にしか興味がないため、0行を選択するだけです。

更新

別の方法です。のブーリアン・マスクを使うのがより簡単でしょう。 str.contains のブール値マスクを使用し、それを反転させて列をマスクするのが簡単でしょう。

In [2]:
df = pd.DataFrame(columns=['a','Unnamed: 1', 'Unnamed: 1','foo'])
df

Out[2]:
Empty DataFrame
Columns: [a, Unnamed: 1, Unnamed: 1, foo]
Index: []

In [4]:
~df.columns.str.contains('Unnamed:')

Out[4]:
array([ True, False, False,  True], dtype=bool)

In [5]:
df[df.columns[~df.columns.str.contains('Unnamed:')]]

Out[5]:
Empty DataFrame
Columns: [a, foo]
Index: []