データフレーム(df)のカラム名、indexを調べる・変更する
最終更新日:2021/7/12
データフレームのindexやカラム名を調べたり、変更する方法を説明します。
前章で簡単に述べましたが、データフレームはindex(行方向のラベル)とカラム(列)があります。Excelとほぼ同じと考えて構いません。
ただし、Excelと異なり、indexやカラムはコードを書いて操作する必要があります。
どこで使うのか?
データ分析に必要な形にデータを加工する為に使います。
csvファイルやExcelに保存されたデータソースが完璧な形で、データを読み込むだけで、データ分析ができればいいのですが、現実にはそうはいきません。
もし、データソースを直接上書きして、csvファイルやExcel上で、形を整えられれば、その方が早い場合も多いです。
しかし、実際にはそう出来ない事が多いです。
或いは、Excelで加工するぐらいならば、Pythonで加工した方が早いことも多々あります。
また、データ分析をする際には、その過程で、indexを変更したり、カラム名を変更・追加といった事が頻繁に行われます。
データ分析をする際に、絶対に避けては通れない、データを綺麗に成型する(データ・クレンジング)部分であり、ここが出来ないと、これ以上は何も出来ません。
【説明すること】
- 1. カラム名(列名)を取得する
- 全てのカラム名(列名)を取得する:
df.columns
- 特定の列番号のカラム名(列名)を取得する:
df.columns[n]
- 取得したカラム名をlistにする:
list(df.columns)
- 1個ずつ変更する:
df.rename(columns={'Old': 'New'})
- まとめて変更する(カラム名を指定して変更):
df.rename(columns={})
- まとめて全て変更する(listで指定):
df.columns = li_new_clm
- 3. indexを取得する:
df.index
- indexをlistで取得する:
li = list(df.index)
- indexをarray(配列)で取得する:
ary = df.index.values
- 1個ずつ変更する:
df_new = df_old.rename(index={'Old': 'New'})
- まとめて全て変更する:
df.index =li_new_idx
- 5. indexとカラム名を同時に変更したい場合
df.rename(index={‘New1’, ’Old1’}, columns={‘new1’, ‘old1’})
- 6. indexを振り直す:
df_r = df.reset_index()
- 7. 既存の列をindexに指定する場合:
df.set_index('clm_name')
- 8. 既存のindexを新しいカラム(列)にする場合:
df_new = df.reset_index()
- 覚えておきたい魔法のオプション:
inplace=True
- コーヒーブレイク:「”s”が付く、付かない」、「カッコが付く、付かない」
1. カラム名(列名)を取得する
全てのカラム名(列名)を取得する: df.columns
ここでは以下のファイルをpd.read_csv('a003_001.csv', index_col=0)
で読み込み、「最初のカラムIndex1をdfのindexとして指定します」。
ファイルはリンク先からダウンロードするか、コピーして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”なしでどう?…。やっぱりそうだったか。」
という事が多いです
あまり重要でない部分や、あまり使わない部分は、必ずしも完璧に覚える必要はありません。
ただし、確かこうだったはず、という感覚は重要です。