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

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

MENU

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

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

を基に学んでいく。

4. pandas入門

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

4.1 pandasのデータ構造

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

4.1.3 インデックスオブジェクト

 \mathrm{pandas}のインデックスオブジェクトは、軸のラベルやその他のメタデータを保持する役目を持つ。
 インデックスオブジェクトは変更ができない。

################################
### インデックスオブジェクト ###
################################

import pandas as pd
import numpy as np

obj = pd.Series(range(3), index = ['a', 'b', 'c'])

index = obj.index

print(index)
print(index[1:])

print('')

# インデックスオブジェクトは変更不可能である
try:
    index[1] = 'd'
except:
    print('インデックスオブジェクトは変更不可能です!')

labels = pd.Index(np.arange(3))
print(labels)

obj2 = pd.Series([1.5, -2.5,0.0], index = labels)
print(obj2)

print('')
print( '●obj2のインデックスはlabelsと同じか?:' + str(obj2.index is labels))

infallible


インデックスオブジェクトは集合のように用いることもできるが、\mathrm{Python}の集合とは異なり、インデックスオブジェクトは重複したラベルを保持できる。重複したラベルデータを検索すると、そのラベルを持つすべてのデータが抽出される。

メソッド
説明
\mathrm{append}
追加のインデックスオブジェクトを連結し新たなインデックスオブジェクトを作成する。
\mathrm{difference}
集合の差を計算し、その差をインデックスオブジェクトとして表現する。
\mathrm{intersection}
集合の論理積を計算する。
\mathrm{union}
和集合を計算する。
\mathrm{isin}
各値が集合に含まれているかどうかを示す\mathrm{Bool}型の配列を返す。
\mathrm{delete}
指定したi番目の要素を削除した新しいインデックスオブジェクトを作成する。
\mathrm{drop}
指定した値を削除した新しいインデックスオブジェクトを作成する。
\mathrm{insert}
指定したi番目に要素を挿入した新しいインデックスオブジェクトを作成する。
\mathrm{is\_monotonic}
各要素が1つ前の要素と等しいか、それよりも大きい場合に\mathrm{True}を返す。
\mathrm{is\_unique}
インデックスオブジェクトが重複した値を持たない場合に\mathrm{True}を返す。
\mathrm{unique}
インデックスオブジェクトから重複の無い値の配列を計算する。

4.2 pandasの重要な機能

4.2.1 再インデックス付与

 \mathrm{pandas}のオブジェクトの非常に重要なメソッドに\mathrm{reindex}がある。このメソッドは、新しいインデックスに従ったデータを持つ新しいオブジェクトを作成する。

############################
### インデックスの再付与 ###
############################

import pandas as pd
import numpy as np

obj = pd.Series([4.5,7.2,-5.3,3.6],index = ['d','b','a','c'])

# reindex:新しいインデックスに従ってデータが再調整される
obj2 = obj.reindex(['a','b','c','d','e']) # eはインデックスオブジェクトに無いため、NaNが与えられる
print(obj2)

 時系列データのようにデータの順序がある場合、再インデックス付けのとき、内挿や穴埋め行えるのが望ましい。そのためには\mathrm{method}オプションを用いる*1

############################
### インデックスの再付与 ###
############################

import pandas as pd
import numpy as np

obj = pd.Series([4.5,7.2,-5.3,3.6],index = ['d','b','a','c'])

# reindex:新しいインデックスに従ってデータが再調整される
obj2 = obj.reindex(['a','b','c','d','e']) # eはインデックスオブジェクトに無いため、NaNが与えられる
print(obj2)

# methodオプションを用いる
obj3 = pd.Series(['blue', 'purple', 'yellow'], index = [0,2,4])
print(obj3)
obj3.reindex(range(6), method = 'ffill') # 欠損部分にはその直前の値が与えられる

# DataFrameでもreindexを用いて行インデックス、列インデックスを変更できる
frame = pd.DataFrame(np.arange(9).reshape((3,3)),
                     index = ['a','c','d'],
                     columns = ['Ohio','Texas','California'])

frame2 = frame.reindex(['a','b','c','d']) # 行を変える場合
frame3 = frame.reindex(columns = ['Texas','Utah','California']) # 列を変える場合

print('')
print(frame2)# 指定しなかったものは削除される
print(frame3)
引数
説明
\mathrm{index}
インデックスに使用する新しいシーケンス
\mathrm{method}
内挿方法の指定
\mathrm{fill\_value}
再インデックス付けにおいて欠損値の代わりに使用する値
\mathrm{limit}
前方、後方挿入の際に埋める数の最大値
\mathrm{tolerance}
前方、後方挿入の際にインデックスの数値にどれくらいの差がある場合まで欠損埋めを行なう最大値
\mathrm{level}
階層型インデックスを使用する場合に行う階層を指定する
\mathrm{copy}
\mathrm{True}にすると常にデータがコピーされる。

*1:なおlocフィールドを用いたインデックス参照で再インデックス付けができるとしているが、現在のバージョンではNaNでの欠損値挿入がなされず、エラーがでる。

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