pandas
のDataFrame
では、インデックス名やカラム名を使ってデータにアクセスしますね。
そのため、pandas
を自由に扱うためには、インデックスやカラムの操作は重要なスキルです!
とは言っても、pandas
の操作に慣れていないうちは、ちょっとした操作も難しいですよね。
例えば、次のようなことで悩んでしまうことも:
- どうやってインデックスやカラムを設定するの?
- インデックスやカラム名を変更する方法は?
そこで、この記事では次の内容をサンプルコード付きで解説していきます:
- インデックスの基本的な設定方法、変更方法
- インデックス番号のリセット方法
インデックス関係の処理をマスターして、自由にpandas
を操作できるようになりましょう!
インデックス・カラムの設定方法
インデックス、カラムの設定方法について様々なケースを紹介します。
pd.DataFrame()
の引き数で設定- 辞書型から
DataFrame
生成時のラベル設定 - Excel、CSVデータ読み込み時に指定
pd.DataFrame()の引き数で設定|index, columns
pd.DataFrame()
を使用すると、リスト
などArray-likeをもとにDataFrame
を作成できます。
このとき引数で、インデックスやカラムも同時に設定できます。
index
:[インデックス名のリスト]
などcolumns
:[カラム名のリスト]
など
意識して覚えたいのが、引数名のindex
は単数なのに、columns
は複数なのです。
リストでインデックス名、カラム名を設定する例を紹介します。
data_list =[[10, 11],
[100, 101],
[1000, 1001]]
df = pd.DataFrame(data_list,
columns=["Col0", "Col1"],
index=["Ind0", "Ind1", "Ind2"] )
[リスト]
からDataFrame
を生成する方法はこちらの記事を参考にしてください。
辞書型からDataFrame生成時のラベル設定
辞書型をpd.DataFrame()
に渡すと次のようにDataFrame
が作成されます。
辞書のkey
:DataFrameのカラム名
辞書のvalues
:DataFrameの値
d = {'Col0':[0, 1],
'Col1': [11, 12],
'Col2': [20, 21]}
df = pd.DataFrame(d)
次のようなネスト構造の辞書型だと、カラム名だけでなくインデックス名も設定されます。
{key_a: {key0: value0, key1: value1}}
外側と内側のキーをもとにカラムとインデックスが設定されます。
d = {"col0":{"ind0": 0, "ind1":1},
"col1":{"ind0": 10, "ind1":11}}
df = pd.DataFrame(data=d)
辞書型のインデックス設定の詳しい解説は、次の記事を参考にしてください。
Excel、CSVデータ読み込み時に指定
pandasでExcel、CSVを読み込むときは、それぞれ次の関数を使います。
- Excelファイルの読み込み:
pd.read_excel(フォルダパス)
- CSVファイルの読み込み:
pd.read_csv(フォルダパス)
いずれの関数でも共通の引数で、ヘッダー行(カラム行)、インデックス行を指定します。
- カラム:
header = ヘッダーの行番号
- インデックス:
index_col = インデックスの列番号
or"列名"
ここでは、次のExcelファイルでヘッダー行、インデックス行を指定してみましょう。
df = pd.read_excel("read_excel_example.xlsx", header=0, index_col=0) # header=0は省略可能
print(df)
# Name apple orange banana
# Gai 10 20 15
# Mamoru 30 40 30
# Hana 50 60 40
# Mikoto 30 40 20
read_excel()
, read_csv()
の詳しい解説はそれぞれ次の記事を参考にしてください。
生成後のdfのインデックス名、カラム名の変更
生成後のDataFrame
にインデックス名やカラム名を設定、一部を変更する方法を紹介します。
- dfのプロパティでラベル名設定①|
df.index=[…]
- dfのメソッドでラベル名設定②|
df.axis()
- ラベル名を一部変更|
df.rename()
- カラム名の前後に文字列追加|
df.prefix ()
,df.suffix()
既存dfにラベル名を設定①|df.index=[…]
既存df
のindex
属性、columns
属性を書き換えると、インデックス、カラムを設定・上書きできます。
df.index = [インデックス名]
などdf.columns = [カラム名]
など
次のDataFrame
を例にインデックス、カラムを設定してみます。
data = [[0, 1, 2],
[10, 11, 12]]
df = pd.DataFrame(data)
インデックス名、カラム名を設定してみます。
df.index=["i0", "i1"]
df.columns=["c0", "c1", "c2"]
既存dfにラベル名を設定②|df.axis()
既存DataFrame
のインデックス、カラムを設定・上書きは、df.set_axis()
メソッドでも可能です。
df.set_axis()
|dfのインデックス、カラム名の設定
引数名 | 型 | 説明 |
---|---|---|
labels |
[リスト] やpd.Index など |
設定するラベル名 ⇒ axis で指定した箇所に設定される |
axis |
数値(0, 1) or str("index", "columns") |
"index" or0 :インデックス名を指定"columns" or 1 :カラム名を指定 |
inplace |
True or False |
True :df そのものを上書きFalse (デフォルト):新しいdf を返す(元のdf は変化なし) |
例えば、既存のdf
のインデックス名・カラム名を設定、上書きする場合には次のように書きます。
- インデックス設定:
df.set_axis([インデックス名], axis="index", inplace=True)
- カラム設定:
df.set_axis([カラム名], axis="columns", inplace=True)
次のDataFrame
を例にインデックス、カラムを設定してみます。
data = [[0, 1, 2],
[10, 11, 12]]
df = pd.DataFrame(data)
インデックス名、カラム名を設定してみます。
df.set_axis(["i0", "i1"], axis="index", inplace=True)
df.set_axis(["c0", "c1", "c2"], axis="columns", inplace=True)
結果はdf.index
, df.columns
の書き換えと同じですね。
列をインデックスに指定|df.set_index()
DataFrame
のメソッド、df.set_index()
で既存の列を指定してインデックス行に設定できます。
次のDataFrame
の"ind"
列をインデックス行に指定しています。
data = [["i0", 0, 1, 2],
["i1", 10, 11, 12]]
df = pd.DataFrame(data, columns=["ind", "c0", "c1", "c2"])
"ind"
列をインデックス行に指定します。
df.set_index("ind", inplace=True)
DataFrame
生成時に、一行で次のように書いてもOKです。
df = pd.DataFrame(data, columns=["ind", "c0", "c1", "c2"]).set_index("ind", inplace=True)
同様の方法で、カラムを設定する方法は存在しないようです。
dfのラベル名を一部変更|df.rename()
既存df
のインデックス、カラムの一部を変更する場合には、df.set_axis()
メソッドを使用します。
df.set_axis()
の引数の与え方には、2種類あります。
index
,columns
それぞれに変更内容を与えるmapper
に変更内容を与えて、axis
で"index"
と"columns"
どちらかを指定
どちらの使い方でもOKですが、わかりやすいパターン1を解説します。
df.set_axis()
|index
,columns
に変更内容を与えるパターン
引数名 | 型 | 説明 |
---|---|---|
index |
辞書型 または 関数 | ラベルの変更方法
|
columns |
辞書型 または 関数 | ラベルの変更方法
|
inplace |
True or False |
True :df そのものを上書きFalse (デフォルト):新しいdf を返す(元のdf は変化なし) |
このとき変更パターンは辞書型または関数で次のように与えます。
- 辞書型:
{既存名1:新規名1, 既存名2:新規名2…}
- 関数:
新規名 = f(既存名)
となるような関数f
次のDataFrame
を例に、それぞれの使用例を紹介します。
data = [[0, 1, 2],
[10, 11, 12],
[20, 21, 22]]
df = pd.DataFrame(data, index=["i0", "i1", "i2"], columns=["c0", "c1", "c2"])
まずは辞書型を使った書き換え例を見ていきましょう。
次の形式で入力した辞書型を使って、ラベル名を書き換えます。
{既存名1:新規名1, 既存名2:新規名2…}
インデックス名、カラム名を変更してみましょう。
df.rename(index={"i0":"index0", "i2": "インデックス2"}
, columns={"c0":"data0", "c1": "data1", "c2":"data2"})
次に関数を適用するパターンを紹介します。
関数を適用する場合には、次のような関数f
が既存ラベル名に適用されると考えましょう。
新規ラベル名 = f(既存ラベル名)
例として、文字列を大文字にする組み込み関数str.upper()
を適用してみます。
df.rename(index=str.upper)
ラムダ関数
との相性もいいです。
既存ラベル名の最後の一文字を抽出して、新規ラベルにする例を紹介します。
f = #関数を作成
df.rename(index= lambda s: int(s[-1]))
自分で作った関数を適用すれば、様々な応用ができそうですね。
ラベル名の前後に文字列追加|df.prefix (), df.suffix()
ラベル名の前後に文字列を追加する場合には、次のメソッドを使用します。
- ラベル名の前に追加|
df.prefix("ラベル前に置く文字列")
- ラベル名の後に追加|
df.suffix("ラベル後に置く文字列")
df.add_prefix("New_")
df.add_suffix("_old")
これらのメソッドは、新しいDataFrame
を返します。
df
を上書きしたい場合は、戻り値をdf
で受けましょう。
df = df.add_prefix("New_") # dfを上書き
インデックスのリセット|df.reset_index()
DataFrame
を結合したり、データの一部を削除したりすると、DataFrame
のインデックス番号がズレることがよくあります。
そういった場合は、df.reset_index()
でインデックス番号を振りなおすことができます。
df.reset_index()
|インデックスの再設定
引数名 | 型 | 説明 |
---|---|---|
drop |
True or False |
True :今のインデックスを列として残すFalse (デフォルト):今のインデックスは残さない |
inplace |
True or False |
True :df そのものを上書きFalse (デフォルト):新しいdf を返す(元のdf は変化なし) |
DataFrame
を結合してインデックス番号がズレてしまう例をみてみます。
data1 = [[0, 1],
[10, 11]]
df1 = pd.DataFrame(data1)
data2 = [[20, 21],
[30, 31]]
df2 = pd.DataFrame(data2)
df_c = pd.concat([df1, df2])
それぞれのdf
のインデックスが結合されているので、ゴチャゴチャになっています。
df.reset_index()
で再設定してみます。
df.reset_index()
デフォルトでは、既存のインデックスは列データとして残ります(上の例では"index"
列)。
残したくない場合はdrop=True
を指定します。
行を削除してインデックス番号がズレたケースを例に、drop=True
の結果を見て見ましょう。
data = [[0, 1],
[10, 11],
[20, 21],
[30, 31]]
df = pd.DataFrame(data, columns=["c0", "c1"])
df.drop(1, inplace=True)
列を削除したので、インデックスが連番ではなくなっていますね。
df.reset_index()
で再設定してみます。
df.reset_index(drop=True)
無事、連番に再設定されました。
おわりに|padans関連おススメ追加コンテンツ
今回はpandasのインデックスの設定、変更に関する内容を紹介しました。
pandas
は便利すぎて操作方法がわかりにくいことがよくあります…。
結局はコツコツ学ぶのが、pandas
マスターの近道ですよね!≫【ブログカテゴリー:pandas】
Twitter@YutaKaでは、ほぼ毎日pythonに関する情報を発信しています。
気楽にツイートしているので、気軽にフォローしてください!