※この記事にはプロモーションが含まれています。

18. Pandasでデータ分析

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

更新日:

この記事は、Python3におけるPandasを用いたDataFrameへのインデックスの指定・削除・変更方法を初心者向けに解説した記事です。インデックスについては、これだけを読んでおけば良いよう、徹底的に解説しています。

 
DataFrameでは、特定の列をインデックスに指定することができます。各行の情報をユニークに指定できる列をインデックスに指定することで、インデックスを指定して情報を取り出しやすくすることができます。

 
また次の記事「Pandas – DataFrameの参照(単一インデックス)」で説明しますが、設定したインデックスを元に、「リストのスライシング」でも学んだスライシングを用いて検索することができます。

 
インデックスは一度設定すると変更できませんので、変更が発生しない列に設定すべきです。(但し、設定したインデックスを外して、再度設定し直すことは可能です。)
 

 
 

動画教材紹介私(清水 義孝)が作成したコース「Pythonによるビジネスに役立つWebスクレイピング」(Udemyへのリンク)が発売中!
発売数8,500本突破を記念して、今だけ期間限定で87%オフの大セール中!!!

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]:

 
 
 
 
 

 
 

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"の列名が、他の項目名より一段下に表示され、インデックスとして設定されていることがわかります。
 
 

動画教材紹介私(清水 義孝)が作成したコース「Pythonによるビジネスに役立つWebスクレイピング」(Udemyへのリンク)が発売中!
発売数8,500本突破を記念して、今だけ期間限定で87%オフの大セール中!!!

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(データフレーム)については、次の記事で詳しく解説しております。

 

 
 
 
最後に...


Pythonの学習においては、実際に様々なプログラムを書いて試していくことが非常に重要です。Pythonについて、さらに詳しく学ばれたい方は、以下の私のUdemy講座をご検討いただければ幸いです。


Pythonを用いて世界中のWebサイトから自動的にデータ収集する方法を、基礎からていねいに学ぶことができます。Pythonを初めて学ばれた方も、最初に取り組みやすい内容になっています。


>> Pythonによるビジネスに役立つWebスクレイピング
発売数8,500本突破を記念して大セール中!期間限定になりますのでお早めに。
Pythonによるビジネスに役立つWebスクレイピング(BeautifulSoup、Selenium、Requests)講座の画面

既に8,500名以上の方に受講頂き、大変好評です。またコースに満足いただけない場合でも、30日返金保証があるので安心です。

期間限定の割引クーポンは、こちらから!
>> Pythonによるビジネスに役立つWebスクレイピング
   
   





-18. Pandasでデータ分析

Copyright© ビジPy , 2024 All Rights Reserved.