データフレーム(df)のカラム名indexを調べる・変更する

最終更新日:2021/7/12

データフレームのindexやカラム名を調べたり、変更する方法を説明します。
前章で簡単に述べましたが、データフレームはindex(行方向のラベル)とカラム(列)があります。Excelとほぼ同じと考えて構いません。

ただし、Excelと異なり、indexやカラムはコードを書いて操作する必要があります。

どこで使うのか?

データ分析に必要な形にデータを加工する為に使います。

csvファイルやExcelに保存されたデータソースが完璧な形で、データを読み込むだけで、データ分析ができればいいのですが、現実にはそうはいきません。
もし、データソースを直接上書きして、csvファイルやExcel上で、形を整えられれば、その方が早い場合も多いです。
しかし、実際にはそう出来ない事が多いです。

或いは、Excelで加工するぐらいならば、Pythonで加工した方が早いことも多々あります。

また、データ分析をする際には、その過程で、indexを変更したり、カラム名を変更・追加といった事が頻繁に行われます。

データ分析をする際に、絶対に避けては通れない、データを綺麗に成型する(データ・クレンジング)部分であり、ここが出来ないと、これ以上は何も出来ません

【説明すること】

1. カラム名(列名)を取得する

全てのカラム名(列名)を取得する: df.columns

ここでは以下のファイルをpd.read_csv('a003_001.csv', index_col=0)で読み込み、「最初のカラムIndex1をdfのindexとして指定します」。
ファイルはリンク先からダウンロードするか、コピーしてcsvファイルにしてください。

a003_001.csv


実際にdf1に読み込むと以下のようになります。


df.columnsで全てのカラム名(列名)が取得できます。
ただし、このままではIndex型で返ってくるので、他のコードへの応用が限定的です。
ですので、多くの場合、この後で説明するlistにします。

特定の列番号のカラム名(列名)を取得する

また、df.columns[n]とすれば、n番目のカラム名が値で取得できます。番号は0始まりです。

取得したカラム名をlistにする: list(df.columns)


実際には、取得したカラム名(列名)を他で使用すること(例えばfor文)が多いはずなので、その場合は取得したいカラム名(列名)をli1_clm = list(df1.columns)のように書いて、listにします。

listにすることでfor文で連続的な処理が可能になります。

2. カラム名を変更する

1個ずつ変更する

カラム名を指定して、1個ずつ変える場合は

df2 = df1.rename(columns={'OldName': 'NewName'})
とします。もとのdfのカラム名は変わらないので、受け皿としてdfを書きます(この例の場合df2)。


しかし、df.rename()のoptionでinplace=Trueと書けば、元のdfのカラム名も上書きされます。

※参考(サイト内): 覚えておきたい魔法のオプション inplace=True

まとめて変更する

(1)カラム名(列名)を指定してまとめて変更する

この場合はディクショナリの数を増やします。
df3 = df1.rename(columns={'CLM2': 'new2','CLM3':'new3'})

(2)カラム名(列名)を全て変更する

listに新しいカラム名(列名)を定義して、
df.columns = li_new_clm
と書きます。
※ただし、dfのカラムの数とli_new_clmの要素の数が同じでないとエラーとなります。
注意点は、.columnsと最後に”s”がつくことです(複数形)。

3. Indexを取得する: df.index

df.indexでindexを知ることができます。
ただし、これは print(df.index) のようにprint()と一緒に使います。

indexをlistで取得する

現実的には取得したindexを用いて、for()文で使いたいという事が多いはずです。listで取得する場合には
li_idx = list(df.index)
と書くことで、li_idxにindexがリストとして格納されます。
普通はこちらを使います。

indexをarray(配列)で取得する

ここまで、まだ説明していませんが、配列(array)で取得したい場合には、
ary_idx = df.index.values
でarrayとしてindexの値がary_idxに格納されます。
arrayはnumpyという行列計算のライブラリーでよく使います。

4. indexを変更する

1個ずつ変更する

前出のカラム名(列名)と同様に、df.rename()にオプションindex={‘Old’,’New’}を指定します。
df_new = df_old.rename(index={‘A1’: ‘Z1’})


複数を個別に指定して変更したい場合は.index={}にディクショナリを追加します。
df_new = df_old.rename(index={'A0':'Z0','A1':'Z1'})


また、この方法だと、元のdf_oldのindexは変更されませが、オプションに inplace=True を指定すれば、元のdf_oldのindexが上書きされます。
もし、Errorが出る場合は、この方法は使わずに、受け皿を書いて、新しく作ったdfを使います。

まとめて全て変更する

df.index =li_new_idxとして、新しいindexをlistで指定すれば、indexを全てまとめて変更することができます。例えば、listを直接書いて
df.index =[‘X0’, ‘X1’, ‘X2’]
や、li_new_idx =[‘X0’, ‘X1’, ‘X2’]と指定して、
df.index = li_new_idx
でも可能です。
※ただし、dfのindexの数とli_new_idxの数が同じでないとエラーとなります。
新しいindexのlistには文字列の[‘X0’, ‘X1’, ‘X2’]、数字の[0, 1, 2]のどちらも指定可能です。


あまり使いませんし、本来避けるべきですが、数字と文字が混じったindexでも指定可能です。

5. indexとカラム名を同時に変更したい場合

カラム名とindex名で1個ずつ変えるならば、
df.rename(index={‘New1’, ’Old1’}, columns={‘new1’, ‘old1’})
の形でindexとcolumnsのオプションを同時に指定します。
複数のindexとカラムを同時に変えたい場合、{}の中に複数を指定します。

6. indexを振り直す

indexを振り直す場合、dfの受け皿を指定して、df_r = df.reset_index()と書きます。

(1)元のindexを残す場合

df_r = df.reset_index()で、元のindexはそのまま新しい列として残ります。

(2)元のindexを削除したい場合

元のindexが不要な場合は、drop=Trueを指定します。

(3)元のdfを書き換えたい場合

元のdfを書き換えたい場合(上記のdf_newが不要な場合)はオプションで、inplace=Trueを指定します。コードはこの後の(4)を参照してください。

(4)元のindexを削除して、元のdfを書き換えたい場合

上記の(2)と(3)の組み合わせです。恐らく一番多く使う方法ではないでしょうか。
オプションでdrop=True, inplace =Trueを指定します。

7. 既存の列をindexに指定する

df.set_index('clm_name')で指定可能です。但し、このままだと受け皿が必要です。例えば、
df_new = df.set_index('clm_name')
のように書きます。
inplace=Trueが指定できるので、これを指定すれば、元のdfが書き換えられ、受け皿は不要です。

8. 既存のindexを新しいカラム(列)にする

indexに使った値を、新しいカラム(列)にしたい、という事が時々あります。
これは、実は既出の「indexを振り直す (1)元のindexを残す」で実現できています。
もう一度df4_r1で確認しましょう。

df4_r1 = df4.reset_index()で元のindexの「0, B1, 2」は”index”という名前の新しいカラム(列)になっています。
この時点で「0, B1, 2」はdf4_r1のindexではなく、これは”index”という「カラム名(列名)」の値となっています。
df4のindexは最初の列の「0, 1, 2」です。


分かりやすいようにdf4_r1の”index”というカラム名を”NewClm”に変えます。inplace=Trueも指定して、df4_r1を書き換えると、以下のようになります。

覚えておきたい魔法のオプション inplace=True

このinplace=Trueはとても重宝するオプションで、そのdf自体を書き換える際によく指定します。元のdfも書き換えたいという場合には、とりあえずinplace=Trueと書いてみます。

ただし、Errorが出る場合があるので、その場合はinplace=Trueを使わずに、受け皿を書いて、新しく作ったdfを使用します。

コーヒーブレイク

Pythonでは、この手の「”s”が付く、付かない」、「カッコ()が付く、付かない」の区別が多く、正しいコードを書いたはずなのに、エラーになる、という事が多々あります。
その場合は、単数形を試す、複数形を試すなどしましょう。
現場でも、細かい事は覚えていない事が多く
「確か”s”だったはず。あれ、エラー?じゃあ、”s”なしでどう?…。やっぱりそうだったか。」
という事が多いです

あまり重要でない部分や、あまり使わない部分は、必ずしも完璧に覚える必要はありません。
ただし、確かこうだったはず、という感覚は重要です。