「大人の教養・知識・気付き」を伸ばすブログ

一流の大人(ビジネスマン、政治家、リーダー…)として知っておきたい、教養・社会動向を意外なところから取り上げ学ぶことで“気付く力”を伸ばすブログです。データ分析・語学に力点を置いています。 →現在、コンサルタントの雛になるべく、少しずつ勉強中です(※2024年1月21日改訂)。

MENU

Pythonによるデータ分析(その12/X)

 仕事上、早々に\mathrm{Python}を使えるようにしないといけないため、

を基に学んでいく。

4. pandas入門

 \mathrm{pandas}は多くのコーディング用法を\mathrm{NumPy}から採用しているが、テーブル形式のデータや不均一なデータを扱うために設計されている。

4.1 pandasのデータ構造

 \mathrm{pandas}を始めるには、まずシリーズ(\mathrm{series})とデータフレーム(\mathrm{DataFrame})に慣れる必要がある。

4.1.2 データフレーム(DataFrame)

 データフレームはテーブル形式のデータ構造を持ち、順序付けられた列を持つ。各列には異なるデータ型を持たせることができる。データフレームは行と列の双方にインデックスを持つ。
 データフレーム作成で最も一般的な方法は、同じ長さを持つリスト型の値を持った辞書か、\mathrm{NumPy}の配列を用いる方法である。

#######################
### DataFrameの定義 ###
#######################

import pandas as pd
import numpy as np

data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],
        'year': [2000,2001,2003,2001,2002,2003],
        'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
frame = pd.DataFrame(data)

frame = pd.DataFrame(data, columns = ['year', 'state', 'pop']) # 列の順番指定
frame2 = pd.DataFrame(data, columns = ['year', 'state', 'pop', 'debt'],
                      index = ['one', 'two', 'three', 'four', 'five', 'six']) # 存在しない列名を宣言すると欠損値を入れて新規作成される


print(frame)
print(frame2)

# 列指定:Seriesとして参照可能
print(frame['year']) # 辞書と同じ指定
print(frame.year)    # 属性指定

# 行指定
print(frame2.loc['three'])


# 値の変更
frame2['debt'] = 16.5 # 列の値を一括変更できる
print(frame2)

frame2['debt'] = np.arange(6.) # 列にリスト・配列を格納するならば、長さを一致させる
print(frame2)

frame2['debt'] = pd.Series([-1.2, -1.5, -1.7], index = ['two', 'four', 'five']) # Seriesを代入する場合、ラベルはインデックスに従って代入。対応するものがないと欠損値を与える
print(frame2)

frame2['eastern'] = frame2['state'] == 'Ohio' # 存在しない列に代入すると、新しい列が作成される
print(frame2)

# 列の削除
del frame2['eastern']
print(frame2)

 一方で、ネストした辞書をデータフレームに変換することもできる。なお参考文献によると、「内側のディクショナリのキーは統合した後にソートされ、データフレームのインデックスになります。」と書かれているが、現在の環境ではそうなっていなかった*1

# ネストした辞書をデータフレームに変換
import pandas as pd

pop = {'Nevada': {2001: 2.4, 2002: 2.9},
       'Ohio': {2000: 1.5, 2001: 1.7, 2002: 3.6}}
frame3 = pd.DataFrame(pop) # 外側の辞書のキーを列のインデックスと解釈し、内側のインデックスのキーを行のインデックスと解釈する
print(frame3)

# 転置
print('')
print(frame3.T)

pd.DataFrame(pop, index = [2001, 2002, 2003])

# Seriesを値に持つ辞書を使う場合も同じように扱われる
pdata = {'Ohio': frame3['Ohio'].iloc[:-1],
         'Nevada': frame3['Nevada'].iloc[:2]}
pdata = pd.DataFrame(pdata)
print('')
print('pdata')
print(pdata)


# データフレームのindex,columnsがname属性を持つ場合、それもコンソールに現れる
frame3.index.name = 'year'
frame3.columns.name = 'state'

print('')
print('frame3')
print(frame3)


# values属性を参照すると、データフレーム内のデータが2次元のndarrayとして返る
print('')
print('frame3.values')
print(frame3.values)
説明
2次元\mathrm{ndarray} データの行列。任意で行名・列名を渡すことが可能。
配列、リスト、タプルを値に持つ辞書 各シーケンスがデータフレームの列になる。すべてのシーケンスは同じ長さでなければならない。
\mathrm{NumPy}の構造化/レコード配列 配列を値に持つ辞書と同様に扱われる。
辞書を値に持つ辞書 値になっている各辞書が列になる。\mathrm{Series}を値に持つ辞書と同様に、辞書のキーは統合され、行インデックスになる。
辞書または\mathrm{Series}のリスト 各要素がデータフレームの行になる。辞書のキーや\mathrm{Series}のインデックスはデータフレームの列ラベルになる。
リストまたはタプルのリスト 2次元\mathrm{ndarray}と同様に扱われる。
別のデータフレーム 何も指定されなければ、入力に使用したデータフレームのインデックスがインデックスとして利用される。
\mathrm{NumPy}\mathrm{MaskedArray} マスクされた値がデータフレームでは欠損値になるという点を除き、2次元\mathrm{ndarray}の場合と同様に扱われる。

*1:環境情報を補足しておくと、OSはWindows 11 Home 22H2、Pythonは3.11.0、Jupyter Notebookは6.4.12である。

プライバシーポリシー お問い合わせ