pandasのDataFrameの概要と生成方法 2015/08/09
pandasにはSeries
とDataFrame
という2つのデータ構造があり、
Series
は1次元配列に似ているのに対して、
DataFrame
は2次元配列というかエクセルのようなスプレッドシートに似ている。
Series
は1次元配列でありながら、0からの整数だけでなく任意の文字列をインデックスとして使うことができる。
DataFrame
は行と列どちらも、0からの整数や任意の文字列をインデックスとして使うことができる。
pandasのDataFrameは pd.DataFrame
を使ってPythonのリストを値とするディクショナリから生成できる。リストは全部同じ長さである必要がある。
import pandas as pd
df1 = pd.DataFrame(
{'name': ['Danny', 'Jess', 'Joey', 'D.J.', 'Steph', 'Michelle'],
'age': [29, 24, 29, 10, 5, 0],
'sex': ['m', 'm', 'm', 'f', 'f', 'f']})
print(df1)
# 出力結果
# age name sex
# 0 29 Danny m
# 1 24 Jess m
# 2 29 Joey m
# 3 10 D.J. f
# 4 5 Steph f
# 5 0 Michelle f
以下のコードでは要素の数が食い違っているため ValueError: arrays must all be same length
というエラーが発生してしまう。
df1 = pd.DataFrame(
{'name': ['Danny', 'Jess', 'Joey', 'D.J.', 'Steph', 'Michelle', 'Comet'],
'age': [29, 24, 29, 10, 5, 0],
'sex': ['m', 'm', 'm', 'f', 'f', 'f']})
データが欠落している箇所があれば NaN を使えばよい。
nan = float("nan")
df1 = pd.DataFrame(
{'name': ['Danny', 'Jess', 'Joey', 'D.J.', 'Steph', 'Michelle', 'Comet'],
'age': [29, 24, 29, 10, 5, 0, nan],
'sex': ['m', 'm', 'm', 'f', 'f', 'f', nan]})
print(df1)
# 出力結果
# age name sex
# 0 29 Danny m
# 1 24 Jess m
# 2 29 Joey m
# 3 10 D.J. f
# 4 5 Steph f
# 5 0 Michelle f
# 6 NaN Comet NaN
Pythonディクショナリの要素は順番が保存されないので、列の順番は意図したとおりになる保証がない。そこでcolumns
というオプションを使うと列の順番を指定することができる。
df1 = pd.DataFrame(
{'name': ['Danny', 'Jess', 'Joey', 'D.J.', 'Steph', 'Michelle', 'Comet'],
'age': [29, 24, 29, 10, 5, 0, nan],
'sex': ['m', 'm', 'm', 'f', 'f', 'f', nan]},
columns=['name', 'age', 'sex'])
print(df1)
# 出力結果
# name age sex
# 0 Danny 29 m
# 1 Jess 24 m
# 2 Joey 29 m
# 3 D.J. 10 f
# 4 Steph 5 f
# 5 Michelle 0 f
# 6 Comet NaN NaN
行のインデックスを0から始まる整数ではなくて任意のものにしたい場合にはindex
というオプションを使う。
df1 = pd.DataFrame(
{'age': [29, 24, 29, 10, 5, 0, nan],
'sex': ['m', 'm', 'm', 'f', 'f', 'f', nan]},
columns=['age', 'sex'],
index=['Danny', 'Jess', 'Joey', 'D.J.', 'Steph', 'Michelle', 'Comet'])
print(df1)
# 出力結果
# age sex
# Danny 29 m
# Jess 24 m
# Joey 29 m
# D.J. 10 f
# Steph 5 f
# Michelle 0 f
# Comet NaN NaN
列のデータをSeriesで指定することもできる。
age = pd.Series([29, 24, 29, 10, 5, 0],
index=['Danny', 'Jess', 'Joey', 'D.J.', 'Steph', 'Michelle'])
sex = pd.Series(['m', 'm', 'm', 'f', 'f', 'f'],
index=['Danny', 'Jess', 'Joey', 'D.J.', 'Steph', 'Michelle'])
df1 = pd.DataFrame({'age': age, 'sex': sex}, columns=['age', 'sex'])
print(df1)
# 出力結果
# age sex
# Danny 29 m
# Jess 24 m
# Joey 29 m
# D.J. 10 f
# Steph 5 f
# Michelle 0 f