pandasのDataFrameの概要と生成方法

pandasにはSeriesDataFrameという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
このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。