18. Pandasでデータ分析

Pandas DataFrameの基本(作成、参照、要素の追加、削除、indexなど)

更新日:

次に2次元のデータを扱うDataFrame(データフレーム)をみていきましょう。Seriesと同様にインデックスを持ちますが、2次元のデータなので、行と列で表現され、複数の行と列が存在します。
 
まずSeriesについての詳しい説明をご覧になる場合、こちらのリンク「Pandas Seriesの基本」をご参照ください。

 

PandasにおけるDataFrameの作成方法

DateFrameもSeriesと同様に、リスト、ディクショナリ、NumPyのndarrayなどから作成することができます。
 
DataFrameは、次のように定義します。

pd.DataFrame(data=データの配列, index=インデックスの配列, columns=列名の配列)

 
まず初めに、リストを元にDataFrameを作成していきます。リストの詳しい説明をご覧になる場合、こちらのリンク「リスト(List)/配列の使い方」から参照ください。
 
リストlist1に3つの文字列「”a1”, “a2”, “a3”」を格納し、pd.DataFrameの引数dataにlist1を渡します。

In [1]: import pandas as pd
...: list1=["a1","a2","a3"]
...: pd.DataFrame(data=list1)
Out[1]:

実行した結果、一番上に0という数値とその下に横線が、その下には1列目に0, 1, 2、2列目にa1, a2, a3が表示されています。

まず横線以下に表示されている1列目の数値0, 1, 2はインデックスで、引数indexに何も渡さないと、デフォルトでは0から始まる連番の数値が上の行から順に設定されます。
 
2列目には、引数dataに渡したリストlist1の値a1, a2, a3が表示されています。Seriesと同様、DataFrameでも、それぞれの行に対応するインデックスが付くかたちでデータが格納されています。
 
このインデックスを指定することで、指定した行のデータを取り出すことができます。詳細は後述致しますが、例えば、インデックス0を指定すると、対応する行のデータa1を取得でき、インデックス2を指定すると、対応する行のデータa3を取得できます。
 
また一番上に表示されている0は列名で、その下のa1, a2, a3に対応する列の名称を表しています。こちらもインデックスと同様、引数columnsに何も渡さないと、デフォルトでは0から始まる連番の数値が左の列から順に設定されます。
 
 
今度はインデックスや列名を指定してDataFrameを作成してみましょう。
 
まずはリストlist1に3行3列のリスト[[1,2,3],[21,22,23],[31,32,33]]を格納し、pd.DataFrameの引数dataにリストlist1を設定します。
 
次に、リストindex1にインデックス["Row1", "Row2", "Row3"]を格納し、引数indexにリストindex1を渡します。
 
また、リストcolumns1に列名["Col1", "Col2", "Col3"]を格納し、引数columnsにリストcolumns1を渡します。

In [2]: list1=[[1,2,3],[21,22,23],[31,32,33]]
...: index1 = ["Row1", "Row2", "Row3"]
...: columns1 =["Col1","Col2","Col3"]
...: pd.DataFrame(data=list1,index=index1,columns=columns1)
Out[2]:

このようにインデックス、列名を指定すると、今回は連番では無く、1行目から順にRow1、Row2、Row3と指定したインデックスが設定されました。
 
また列名も1列目から順にCol1、Col2、Col3と設定されています。
 
 
次に、NumPyで作成したndarrayからDataFrameを作成してみましょう。インデックス、列名には、先ほどの例と同じものを利用します。
 
NumPyの詳しい説明については、こちらのリンク「NumPyのインストールから使い方徹底解説」からご参照ください。

In [3]: import numpy as np
...: arr1 = np.array([[1,2,3],[21,22,23],[31,32,33]])
...: pd.DataFrame(data=arr1,index=index1,columns=columns1)
Out[3]:

 
 
そして、ディクショナリからDataFrameを作成する例も確認していきましょう。
 
ディクショナリの詳しい説明をご覧になる場合、こちらのリンク「Dictionary(辞書)」から参照ください。
 
ディクショナリのキーと合わせて、列単位でデータを設定していくかたちになります。そしてキーRow1、Row2、Row3が列名として設定されます。

In [4]: dict1=dict(Row1=[1,21,31],Row2=[2,22,32],Row3=[3,23,33])
...: pd.DataFrame(data=dict1)
Out[4]:

 
 
またSeriesと同様、DataFrameも、文字列、整数だけでなく、様々なデータ型のオブジェクトを複数、合わせて格納することができます。

In [5]: list2=[["P001","iPhone 8 64GB",85000],
...:          ["P002","iPhone X 256GB",130000],
...:          ["P003","iPhone SE 32GB",37000]]
...: columns2 = ["Product ID","Product Name","Price (JPY)"]
...: pd.DataFrame(data=list2,columns=columns2)
Out[5]:

 
 
 

PandasのDataFrameへの行の追加(append)

DataFrameに行を追加するには、追加したいデータのDataFrameを作成し、既存のDataFrameに対して、appendを利用して追加します。
 
appendは、次のように記述します。引数ignore_indexは、Trueを渡した場合、設定してあるインデックスは使われずに、新たに0から番号が再設定されます。
 
Falseを渡した場合、前のインデックスが変更されずに残ります。引数ignore_indexを省略すると、Falseになります。

既存のDataFrame.append(追加するDataFrame, ignore_index=True/False)

 
まずは既存のDataFrameに該当するdf1を用意します。

In [6]: list2 = [["P001","iPhone 8 64GB",85000],
...:          ["P002","iPhone X 256GB",130000],
...:          ["P003","iPhone SE 32GB",37000]]
...: columns2 = ["Product ID","Product Name","Price (JPY)"]
...: df1 = pd.DataFrame(data=list2,columns=columns2)
...: df1
Out[6]:

 
次に追加するDataFrameを定義します。列名は同じですので、先ほど定義したリストcolumns2を使います。

In [7]: df2 = pd.DataFrame(data = [["P004", "iPhone 7 32GB", 10000]],
...:                                columns = columns2)
...: df2
Out[7]:

 
最後に、既存のDataFrameであるdf1に対して、appendを利用しdf2を追加します。
 
ignore_indexは、Trueにしてインデックスの番号を振り直します。(参考までにFalseにすると、インデックスの番号はそのまま残り、上から順に0、1、2、0となります。)

In [8]: df1=df1.append(df2, ignore_index = True)
...: df1
Out[8]:

このようにして、DataFrameに対してデータを追加することができました。
 
 

PandasのDataFrameへの列の追加

今度は列を追加してみましょう。列の追加は、次のようにDataFrameに対して列名を指定して、対象の列の情報をリストで渡します。

In [9]: df1["Screen Size (in.)"] = [4.7, 5.8, 4, 4.7]
...: df1
Out[9]:

 
 
 

PandasでのDataFrameからの行の削除(drop)

次にDataFrameからの行の削除方法を見ていきましょう。
 
削除はdropを利用し、引数には削除したい要素のインデックスを渡します。その他にもよく利用する引数がありますが、この後に紹介します。

DataFrame.drop(インデックス)

 
先ほど作成したDataFrameのdf1から、インデックス2の行を削除します。

 
 
 
 

In [10]: df1.drop(2)
Out[10]:

dropに削除したい行のインデックス2を設定し実行すると、該当行が削除されました。
 
但し、このままでは、もう一度df1の内容を確認すると、先ほど削除した行が復活しています。

In [11]: df1
Out[11]:

 
削除の実行結果をdf1に保存するには、dropには引数inplaceというものがあり、inplaceに対してTrueを渡してやる必要があります。
 
何も指定しなければ、Falseとなり、先ほどのように実行結果が保存されません。
 
それでは、引数inplaceにTrueを渡して再実行します。今回は、df1からインデックス2、3の複数の行を削除してみましょう。
 
複数の行を指定する場合、インデックスをリストで指定します。この場合は、[2, 3]を指定します。

In [12]: df1.drop([2, 3], inplace = True)
....: df1
Out[12]:

引数inplaceにTrueを指定してdropを実行した後、DataFrameの中身を確認すると、削除した結果が保存されていることがわかりました。
 
 

PandasでのDataFrameからの列の削除(drop)

DataFrameは、行と列とで表されるので、行だけではなく、列を削除したい場合も出てきます。その場合はどのようにすればいいのでしょうか。
 
列を削除する場合は、dropの引数axisで1(列)を指定します。何も指定しなければ、0(行)を指定したことになります。
 
それでは、列"Screen Size (in.)"を削除してみましょう。この場合は、dropにはインデックスの代わりに列名"Screen Size (in.)"を渡し、また引数axisに1を指定します。

In [13]: df1.drop("Screen Size (in.)",axis=1,inplace=True)
....: df1
Out[13]:

列"Screen Size (in.)"が削除されました。
 
 
関連記事です。
DataFrame(データフレーム)のデータ検索時に便利なインデックスの追加・削除方法については、こちらをご覧ください。


 
DataFrame(データフレーム)のソート方法については、こちらが参考になります。

 
Pandasの主なデータ構造の内の1つ、1次元のデータ構造であるSeries(シリーズ)について解説しています。

 
私の著書の紹介です。


 

-18. Pandasでデータ分析

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