18. Pandasでデータ分析

Pandas DataFrameへのインデックスの指定と削除、変更(振り直し)

更新日:

DataFrameにある列の中から、特定の列をインデックスに指定することもできます。各行の情報をユニークに指定できる列をインデックスに指定することで、インデックスを指定して情報を取り出しやすくすることができます。また後ほどの章「Pandas – DataFrameの参照(単一インデックス)」で説明しますが、設定したインデックスを元に、「リストのスライシング」でも学んだスライシングを用いて検索することができます。
 
インデックスは一度設定すると変更できませんので、変更が発生しない列に設定すべきです。(但し、設定したインデックスを外して、再度設定し直すことは可能です。)

著書紹介(清水 義孝)

好評発売中!!99円

PandasにおけるDataFrameへのインデックスの指定

インデックスの指定には、set_indexを使います。

DataFrame.set_index(インデックスに指定する列名, inplace = True/False)

inplaceにTrueを渡すとインデックス設定の実行結果がDataFrameに保存され、何も指定しなければFalseとなり、DataFrameには実行結果が保存されません。
 
次のような商品マスタの情報を格納するDataframe df1に対して、インデックスを設定してみましょう。

In [1]: import pandas as pd
...: list1 = [["P001","iPhone 8 64GB",85000],
...:             ["P002","iPhone X 256GB",130000],
...:             ["P003","iPhone SE 32GB",37000]] ...: columns1 = ["Product ID","Product Name","Price (JPY)"] ...: df1 = pd.DataFrame(data=list1,columns=columns1)
...: df1
Out[1]:

 
 
 
 

ここでは、df1に対してインデックスは0、1、2と連番になっています。
 
このような連番では、後々インデックスを指定して行の情報を取得したい場合、思い出すことができず、都度都度インデックスを調べるか、インデックスを使わずに、別の方法で検索することになり、不便です。
 
この商品マスタの行をユニークに識別する列は”Product ID”になりますので、”Product ID”をインデックスに設定しましょう。引数inplaceにはTrueを指定して、設定したインデックスをDataFrameに保存します。(Falseを指定して保存しなければ、次にdf1を確認すると、インデックスが連番に戻っています。)

In [2]: df1.set_index("Product ID",inplace=True)
...: df1
Out[2]:

 
 
 
 
 

 
 

著書紹介(清水 義孝)

好評発売中!!99円

PandasにおけるDataFrameへの階層型インデックスの指定

またインデックスは1つの列だけでなく、複数の列に対して指定することもできます。これを階層型インデックスと言います。
 
次のような受注伝票の明細データの場合、”Sales_No”、” Sales_Item_No”の2つの列が、行を特定する列になりますので、インデックスとしてこれら2つの列を設定することになります。
 
受注伝票明細

Sales_NoSales_Item_NoProduct_IDQtyAmountTax
A0011P00117000560
A0012P00227700616
A0021P00316800544
A0022P0064350002800
A0031P0053300002400
A0041P00257700616
A0042P00316800544
A0043P0081420003360
A0044P0052300002400
A0045P010112000960

 
それではまず、上記の受注伝票明細の情報が保存されているCSVファイル「T_Sales_Item」をread_csvで読み込み(※CSVファイルは上のリンクから取得してください。)、DataFrame df_sales_itemに格納します。
 
次にdf_sales_itemの中から、headを利用して最初の6行を確認します。read_csv、headともに、詳しくは後の章で解説します。

In [3]: df_sales_item=pd.read_csv("T_Sales_Item.csv")
...: df_sales_item.head(6)
Out[3]:

 
 
 
 
 
 

df_sales_itemでは、インデックスは連番になっています。
 
それでは、インデックスを変更して、2つの列"Sales_No","Sales_Item_No"をインデックスに設定しましょう。set_indexに対して、2つの列をリストで渡します。

In [4]: df_sales_item.set_index(["Sales_No","Sales_Item_No"],inplace=True)
...: df_sales_item.head(6)
Out[4]:

 
 
 
 
 
 
 

実行結果を確認すると、"Sales_No","Sales_Item_No"の列名が、他の項目名より一段下に表示され、インデックスとして設定されていることがわかります。
 
 

著書紹介(清水 義孝)

好評発売中!!99円

PandasにおけるDataFrameへのインデックスの解除・変更(振り直し)

インデックスの解除はreset_indexを使用します。インデックスの解除により、インデックスは連番に戻ります。inplaceは指定しなければFalseになり、インデックスの解除がDataFrameに保存されません。

DataFrame.reset_index(inplace = True/False)

 
reset_indexは、インデックスを変更(振り直し)したい場合にも利用されます。一度設定したインデックスは直接変更できません。set_indexで設定したインデックスが間違っていた場合、reset_indexで一度解除してから、再びset_indexで正しいインデックスに設定し直します。
 
先ほどインデックスに"Sales_No","Sales_Item_No"を指定したDataFrame df_sales_itemのインデックスを解除します。

In [5]: df_sales_item.reset_index(inplace=True)
...: df_sales_item.head(6)
Out[5]:

 
 
 
 
 
 

インデックスが解除され、連番に戻っていることがわかりました。
 
 
関連記事です。
Pandasの中心となるDataFrame(データフレーム)については、次の記事で詳しく解説しております。

 

-18. Pandasでデータ分析

Copyright© AI-interのPython3入門 , 2019 All Rights Reserved.