pandasの使い方

2.3.DataFrameの構造と作成

DataFrameは二次配列を表現するデータの集合体です。
pandas.DataFrame( data = None, index = None, columns = None, dtype = None, name = None copy = False )
引数 概要
data 格納するデータを指定します(下図青枠)。
index data行一つ一つに対応するlabelを指定します(下図赤枠)。
指定しない場合は連番[0, 1, 2, …]が自動的に入ります。
columns data列一つ一つに対応するlabelを指定します(下図緑枠)。
指定しない場合は連番[0, 1, 2, …]が自動的に入ります。
dtype 指定したdata(下図青枠)のデータ型(int, float, str等)を指定します。
指定しない場合は、dataから自動的に設定されます (dataに文字列が含まれると、数値もstr型になります)。

DataFrame:二次配列
DataFrame:二次配列

行 / 列Noは自動的に付与され、0からの連番(0, 1, 2, …)になります。
DataFrameを新規に作成する場合、dataには次のいずれかを用います。

  • リスト(Python標準) :[[*, *, …], [*, *, …], …]
  • タプル(Python標準) :((*, *, …), (*, *, …), …)
  • Dictionary(Python標準) :{ 'x':[*, *, …], 'y':[*, *, …], …}
  • 二次元のndarray(Numpy配列) :array( [[*, *, …], [*, *, …], …] )
  • Series(pandas) :[ser1, ser2, …](2.2節参照)

DataFrameは二次元なので、二階層になるようリスト等を設定する必要があります。

DataFrame:二次配列

  1. dataの定義
  2. indexの定義
  3. columnsの定義
  4. dtypeの定義
  5. dataの型
  6. DataFrame作成時のエラー

(1)dataの定義

a)リスト、タプル、二次元Numpy配列

pandasをpdで表すとして(import pandas as pd)、
pd.DataFrame( *** ) または pd.DataFrame( data = *** )
*** = [[*, *, …], [*, *, …], …]
or
((*, *, …), (*, *, …), …)
or
np.array( [[*, *, …], [*, *, …], …] )
“data =”は省略可能です。
>>> pd.DataFrame( [[1, 2, 3], [4, ,5, 6]] )	#リストで指定
>>> pd.DataFrame( ((1, 2, 3), (4, 5, 6)) )	#タプルで指定
>>> pd.DataFrame( np.array([[1,2,3], [4,5,6]]) )	#Numpy配列で指定

#結果はどれも同じ
   0  1  2
0  1  2  3
1  4  5  6

index、columnsとも定義していないので、0から始まる連番が設定されています。 indexの定義は(2)、columnsの定義は(3)を参照ください。

リスト、タプル、二次元numpy配列、Dictionaryは、変数に入れてからDataFrameを作ることもできます(むしろこちらの方が一般的)。
ls = [[*, *, …], [*, *, …], …](リストの場合)とおいて、
pd.DataFrame( ls ) または pd.DataFrame( data = ls )
>>> ls = [[1, 2, 3], [4, 5, 6]]		#例えばリストの場合
>>> pd.DataFrame( ls )
   0  1  2
0  1  2  3
1  4  5  6

項はじめに戻る

b)Dictionary

keyは、columnsラベルとして同時に設定されます。 この場合、行方向と列方向を意識しておく必要があります。
pd.DataFrame( data = { 'x' : [*, *, …], 'y' : [*, *, …], … } )
変数を使って指定する場合は次のようにします。
dic = { 'x' : [*, *, …], 'y' : [*, *, …], … }とおいて、 pd.DataFrame( dic ) または pd.DataFrame( data = dic )
>>> pd.DataFrame( {'a': [1, 4], 'b': [2, 5], 'c': [3, 6]} )
   a  b  c
0  1  2  3
1  4  5  6

#もし、{'a': [1, 2, 3], 'b': [4, 5, 6]}と設定すると
>>> pd.DataFrame( {'a': [1, 2, 3], 'b': [4, 5, 6]} )
   a  b
0  1  4
1  2  5
2  3  6

項はじめに戻る

c)Series(pandas)

1つのSeriesをDataFrame化する場合、indexはそのまま継承、nameはcolumnsラベルとして扱われます。
pd.DataFrame( ser1 )
または
pd.DataFrame( data = ser1 )
>>> ser = pd.Series([1, 2, 3], index = ['a', 'b', 'c'], name = 'x')
>>> ser
a    1
b    2
c    3
Name: x, dtype: int64

>>> pd.DataFrame(ser)
   x
a  1
b  2
c  3

2つ以上のSeriesをDataFrame化する場合、indexはcolumns、nameはindexとして扱われます。
pd.DataFrame( [ser1, ser2, …] )
または
pd.DataFrame( data = [ser1, ser2, …])
>>> ser1 = pd.Series([1, 2, 3], index = ['a', 'b', 'c'], name = 'x')
>>> ser2 = pd.Series([4, 5, 6], index = ['a', 'b', 'c'], name = 'y')
>>> df = pd.DataFrame([ser1, ser2])
>>> df
   a  b  c
x  1  2  3
y  4  5  6

indexをそのまま継承したい場合はDataFrame化後、行と列を入れ替える転置(df.T)を行います。
>>> df.T
   x  y
a  1  4
b  2  5
c  3  6

indexが一致しない場合、次のようになります。
>>> ser1 = pd.Series([1, 2, 3], index = ['a', 'b', 'c'], name = 'x')
>>> ser3 = pd.Series([4, 5, 6], index = ['a', 'b', 'd'], name = 'y')
>>> pd.DataFrame([ser1, ser3])
     a    b    c    d
x  1.0  2.0  3.0  NaN
y  4.0  5.0  NaN  6.0

nameが同じ場合、次のようになります。
>>> ser1 = pd.Series([1, 2, 3], index = ['a', 'b', 'c'], name = 'x')
>>> ser4 = pd.Series([4, 5, 6], index = ['a', 'b', 'c'], name = 'x')
>>> pd.DataFrame([ser1, ser4])
   a  b  c
x  1  2  3
x  4  5  6

項はじめに戻る

節はじめに戻る



      

~~~ 目次 ~~~

参考文献