gijyutsu-keisan.com

pandasの使い方

ライブラリの使い方 > Python

2.2.Seriesの構造と作成

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

  • リスト(Python標準) :[*, *, …]
  • タプル(Python標準) :( *, *, … )
  • Dictionary(Python標準) :{ 'x' : *, 'y' : *, … }
  • 一次元のndarray(Numpy配列) :array([ *, *, … ])
Seriesは一次配列であるため、行や列といった軸方向の概念はありません。 柔軟に(?)対応します(DataFrameは行、列の方向に注意が必要です)。

(1)dataの定義

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

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

#結果はどれも同じ
0    1
1    2
2    3
dtype: int64
indexを定義していないので、0から始まる連番が設定されています。 indexの定義は(2)を参照ください。
リスト、タプル、numpy配列、Dictionary、Seriesは、変数に入れてからDataFrameを作ることもできます (むしろこちらの方が一般的)。
ls = [*, *, …] (リストの場合)とおいて、
pd.Series( ls ) または pd.Series( data = ls )
>>> ls = [1, 2, 3]		#例えばリストの場合
>>> pd.Series( ls )
0    1
1    2
2    3
dtype: int64

項はじめに戻る

b)Dictionary

keyをindexラベルとして、dataと同時に設定されます。
pd.Series( { 'x' : *, 'y' : *, … } ) または pd.Series( data = { 'x' : *, 'y' : *, … } )
>>> pd.Series( {'a':1, 'b':2, 'c':3} )
a    1
b    2
c    3
dtype: int64
変数を使って指定する場合は次のようにします。
dic = { 'x' : *, 'y' : *, … }とおいて、
pd.Series( dic ) または pd.Series( data = dic )
>>> dic = {'a':1, 'b':2, 'c':3}
>>> pd.Series( data = dic )
a    1
b    2
c    3
dtype: int64

項はじめに戻る

節はじめに戻る

(2)indexの定義

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

pandasをpdで表すとして(import pandas as pd)、
pd.Series( ls, index = [*, *, …] )
pd.Series( ls, index = (*, *, …) )
pd.Series( ls, index = np.array([ *, *, … ]) )
>>> ID = ['a', 'b', 'c']		#リストで指定
>>> ID = ('a', 'b', 'c')		#タプルで指定
>>> ID = np.array(['a', 'b', 'c'])	#Numpy配列で指定

#結果はどれも同じ
>>> pd.Series( [1, 2, 3], index = ID )
a    1
b    2
c    3
dtype: int64
なお、indexラベルは同じ値でも、空白でも構いません。
>>> pd.Series( [1,2,3], index = ['a', 'a', ''])	#1, 2行目は同じ、3行目は空白
a    1
a    2
3
dtype: int64

項はじめに戻る

b)dataをDictionaryで定義した場合

Dictionaryでdataを定義する場合、keyはindexラベルとして扱われます((1)b)参照)。
>>> dic = {'a': 1, 'b': 2, 'c': 3}
>>> pd.Series(dic)
a    1
b    2
c    3
dtype: int64
dataにDictionaryを定義した上で、indexにDictionaryのKeyと異なる値のリストを定義した場合、次のようになります。
>>> dic = {'a':1, 'b':2, 'c':3}
>>> pd.Series( dic, index = ['x', 'b', 'c'] )	#'a'と'x'が異なる
x    NaN
b    2.0
c    3.0
dtype: float64
dataにDictionaryをした上で、indexに異なる順序のリストを定義した場合、indexで定義した順番に並べ替えられます。
>>> dic = {'a':1, 'b':2, 'c':3}
>>> pd.Series(dic, index = ['c', 'b', 'a'])
c    3
b    2
a    1

項はじめに戻る

節はじめに戻る

(3)nameの定義

a)nameの定義

Seriesにname = 'Array'と設定します。
pd.Series( data = ls, name = *** )
例えば、Seriesにname = 'Array'と設定します。
#name設定なしの場合
>>> pd.Series([1,2,3])
0    1
1    2
2    3
dtype: int64

#nameを設定した場合
>>> pd.Series([1,2,3], name = 'Array')
0    1
1    2
2    3
Name: Array, dtype: int64

項はじめに戻る

b)DataFrame化時のname

2つのSeriesをDataFrameに変換する場合、nameは結合方法によってindexラベルまたはcolumnラベルとして使用されます。
>>> ser1 = pd.Series( [1, 2, 3 ], name = 'Array' )
>>> ser2 = pd.Series( [ 2, 4, 6], name = 'Array2' )

#indexラベルとして使用される
>>> pd.DataFrame([ser1, ser2])
0  1  2
Array   1  2  3
Array2  2  4  6

#columnsラベルとして使用される
>>> pd.concat([ser1, ser2], axis = 1)
Array  Array2
0      1       2
1      2       4
2      3       6

項はじめに戻る

c)Series結合時のname

  • nameが異なれば、結合したSeriesのnameは未設定になります。
  • nameが同じなら、結合したSereisのnameはそのまま継続されます。
>>> ser1 = pd.Series( [ 1, 2, 3], name  = 'Array' )
>>> ser2 = pd.Series( [ 2, 4, 6], name  = 'Array2' )

#nameが異なる場合
>>> pd.concat( [ser1, ser2] )
0    1
1    2
2    3
0    2
1    4
2    6
dtype: int64

#nameが同じ場合
>>> ser2 = pd.Series( [2, 4, 6], name = 'Array')
>>> pd.concat( [ser1, ser2] )
・・・(省略)・・・
Name: Array, dtype: int64

項はじめに戻る

節はじめに戻る

id="asec14">

(4)dtypeの定義

dtypeは、Seriesデータをすべて同じ型に設定します。
pd.Series( ls, dtype = *** )
***にはおおまかに、int(整数)、float(浮動小数点)、 complex(複素数)、str(文字列)、bool(True or False)等があります。 型を指定しない場合、データから自動で型指定されます。
#float型を指定
>>> pd.Series([1,2,3], dtype=float)
0    1.0
1    2.0
2    3.0
dtype: float64
数値をstr型としている場合、一目ではわかり難いので注意が必要です。
>>> pd.Series( [1 ,2 , 3 ], dtype = str )
0    1
1    2
2    3
dtype: object	#←ここに注目
>>> type( ser[1] )

要素を一つ抽出して型を調べるか、計算してみるとわかります。
#要素の型を調べる
>>> type( ser[1] )
<class 'str'>

#計算してみる
>>> ser + ser
0    11		# 1+1=11で文字の追加になっている
1    22
2    33
dtype: object

節はじめに戻る

(5)dataの型

型を指定しない場合(dtypeの指定なし)、データの中身から自動で型指定されます。
#指定しない場合 → リストの中身からint型が割り当てられる
>>> pd.Series([1,2,3])
0    1
1    2
2    3
dtype: int64
data指定するリストに複数の型が含まれる場合、型によって処理は変わります。 int型とfloat型が含まれている場合、float型に合わせてfloat型が設定されます。
>>> ls = [1, 2, 3.0]
>>> ser = pd.Series( ls )
>>> ser
0    1.0
1    2.0
2    3.0
dtype: float64
リストにint型、float型、str型が含まれている場合、リストls = ['a', 2, 3.0](str, int, float)をdataに引き当てると、各データはリストの型をそのまま継承しています。
>>> ls = ['a', 2, 3.0
>>> ser = pd.Series(ls)
>>> type(ser[0])
<class 'str'>
>>> type(ser[1])
<class 'int'>
>>> type(ser[2])
<class 'float'>
このSeriesを足してみると、次のようになります。
>>> ser + ser
0    aa
1     4
2     6
dtype: object
1行目の要素はstr型なので、文字追加が行われ、2行目のint型、3行目のfloat型は数値のため、足し算が行われています。
例えば、数値がstr型で記録されている場合(1がstr型の場合)、思わぬ計算エラーや計算結果が生じてしまいます。
>>> ls = ['1', 2, 3.0]
>>> ser = pd.Series( ls )
>>> ser
0    1
1    2
2    3
dtype: object
>>> type(ser[0])
<class 'str'>
>>> type(ser[1])
<class 'int'>
>>> type(ser[2])
<class 'float'>

>>> ser + ser
0    11		#str型のため文字連結となっている
1     4		#int型のため数値の足し算
2     6		#float型のため数値の足し算
dtype: object
このように、dataに引き当てる値の型を意識してく必要があります。

節はじめに戻る

(6)Series作成時のエラー

a)空のSeriesは作れません。

'pd.Series()'のような指示は、DataFrameでは可能ですが、Seriesはできません。
>>> pd.Series()
__main__:1: DeprecationWarning: The default dtype for empty Series will be 'object' instead of 'float64' in a future version. Specify a dtype explicitly to silence this warning.
Series([], dtype: float64)

b)dataサイズとindexサイズのアンマッチ

dataサイズとindexサイズが異なる場合、エラーが発生します。dataサイズとindexサイズは合わせる必要があります。
>>> pd.Series( [1, 2, 3],  index = [ 'a',  'b' ] )
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
***** 省略 *****
ValueError: Length of passed values is 3, index implies 2

節はじめに戻る

参考文献

関連ページ