pandasメモ

Document
Python for Data Analysis

DataFrame
DataFrameGroupBy
DataFrameGroupByを構成するSeriesはSeriesGroupBy
DataFrameGroupByとSeriesGroupByはGroupByのサブクラス
Series
Series.str

データフレームの表示する行数を設定する
pandas.set_option('display.max_rows', 8)
pandas.set_option() *

axisキーワードで適用する軸を決める0は行、1は列

DataFrame

data = {
  'A': [1, 2, 3],
  'B': ['a', 'b', 'c'],
  'C': [1.1, 2.1, 3.1]
}

df = DataFrame(data)

# インデックスのタイトル
df.index.name = "bar"

# カラムのタイトル
df.column.name = "bar"

# データフレームのカラムの順番を指定する
df = DataFrame(data, columns=['C', 'A', 'B'], index=['one', 'two', 'three'])

# 上記と同じ
data = {
  'A': {'one':1, 'two':2, 'three':3},
  'B': {'one':'a', 'two':'b', 'three':'c'},
  'C': {'one':1.1, 'two':2.1, 'three':3.1}
}
df = DataFrame(data)

# 整数で値を取得
df.iloc[0, 0]
# 1
df.iloc[:2, 0]
# [1, 2] (Series)
df.iloc[:2, [0, 1]]
# [[1, 'a'], [2, 'b']] (DataFrame)

# 名前で取得
df.loc['one, ''A']
# 1


# 転置
df.T

# 2次元のnarrayを返す
df.values

# データが無い場合はNaNが割り当てられる
# D列とfour行の値はNaN
df = DataFrame(data, columns=['C', 'A', 'B', 'D'], index=['one', 'two', 'three', 'four'])

# A列とB列をインデックスにする
df.set_index(['A', 'B'])
# インデックスを列にする
df.reset_index()

# カラム名の一覧を取得
df.columns

df.ix[行, 列]

# 行をSeriesとして取得
df['A']
df.A
df.ix[:, 'A']
# 行をSeriesとして取得
df.ix[1]
df.ix['foo']

# DataFrame
# C, Aの列を取得
df[['C', 'A']]
# 上から2行
df[:2]
# Cの値が2より小さい行
df[df['C'] < 2]
# 2より小さいデータをTrue, 小さくないものをFalse
df < 2
# 2より小さいデータを8
df[df < 2] = 8
# df.ix[<indexの条件>, <columnの条件>]
df.ix[df['C'] < 2, :2]

# 行をSeriesとして取得
df.ix['one']

# 値をセット
df['C'] = 1.5
df['C'] = numpy.arange(4)
s = Series([2.9, 3.9], index=['two', 'three'])
# 無いものはNaN
df['C'] = s
# 列の削除
del df['C']

# データフレームやSeriesでの足し算や引き算で両方共通にないカラムとインデックスの値はNaNになる
# 埋めたい場合はfill_valueを指定する
df1.add(df2, fill_value=0)

# 足し算や引き算の反映(ブロードキャスト)は行単位
data = {
  'A': {'one':1, 'two':2, 'three':3},
  'B': {'one':4, 'two':5, 'three':6},
  'C': {'one':7, 'two':8, 'three':8}
}
df = DataFrame(data)
df - df.ix[0]
# [[0,0,0],[3,3,3][6,6,6]]

# 列単位で処理するにはaxis=0にする
s = df.B
df.sub(s, axis=0)
# [[-1,0,1],[-1,0,1][-1,0,1]]


集約関数のlevelはMultiIndexの階層の集約範囲を指定することに利用される


df.duplicated(keep=’first’)
行の値の重複しているか真偽値のSeriesを返す

df.drop_duplicates()
行の値の重複してる行を削除したSeriesを返す

apply
df.apply(func, axis=0, broadcast=False, raw=False, reduce=None, args=(), **kwds)
行もしくは列単位で関数を適応する。
関数がスカラーを返すときはSeriesを返す。
Seriesを返すときはDataFrameを返す。

df.applymap(func)
データを取ってデータを返す関数を適応する。
DataFrameを返す。

Index
setと似ている
immutable
idx.append()
idx.insert()
idx.delete()
idx.drop()

idx.diff()
idx.intersection()
idx.union()

idx.isin()
idx.is_monotonic()

df.index.is_unique
インデックスがユニークかどうか

df.reindex(index=None, columns=None, **kwargs)
インデックス名とカラム名を指定したリストものにする。
既に存在していたインデックス名があれば、そのデータを引き継ぐ、ない場合はその行はNaNになる。 無い場合fill_valueが引数で指定されていればその値にmethodが指定されていればそれにあわせて前方か後方の値が埋められる。  

df.xs()
MultiIndexからのデータの取得に便利

df.iloc
整数で位置を指定してデータを取り出す
位置は配列を指定する

df.get_value()
df.get_value()

df.drop(labels, axis=0, level=None, inplace=False, errors=’raise’)
axisで軸を指定して指定した名前のインデックスもしくはカラムに存在するデータを削除する

ファイルからDataFrameを生成する
pandas.read_table()
pandas.read_csv()

DataFrameの結合/変換
pandas.merge()
指定したDataFrameの共通のカラム名で名寄せしてマージする
pandas.pivot_table()
指定したDataFrameの値をカラム名やインデックス名にして変換したDataFrameを返す。
aggfuncには集約する関数を指定する。
pandas.concat()
データフレームを縦方向もしくは横方向に結合する
df.T

Series
s.values
値を取得
s.index
index一覧

v = s['a']
s['a'] = 8
# インデックス名を指定してSeriesを取得
s[['b', 'c', 'a']]
s[s > 0]
s * 2
np.sqrt(s)
# インデックス名が存在しているか
'a' in s
# 下記2つは同じ
s = Series({'a': 1, 'b': 2, 'c': 3})
s = Series([1, 2, 3], index=['a', 'b', 'c'])
# インデックス名の変更
s.index = ['A', 'B', 'C']
# 足し算で片方にしかないインデックス名の結果はNaN
# つまりNaN + 1はNaN
s1 + S2

# インデックス名と数値どちらでも値にアクセスすることができる
s[0]
s['a']
s[0:2]
s[['c', 'a']]
s[[2, 1]]
s[s < 2]
# スライスは終点が含まれる

# 関数の適用
s.apply(func)

s.index = pd.Index(range(5))

s.isnull()
欠損値がTrue、それ以外がFalseでインデックス名はそのままのSeriesを返す

s.notnull()
欠損値がFalse、それ以外がTrueでインデックス名はそのままのSeriesを返す

s.name
Seriesのタイトル

s.index.name
インデックスのタイトル


df.fillna()
s.fillna()
NA/NaN値を置き換える

s.notnull()
nullならFalse, nullでないならTrueのSeriesと同じ大きさの配列を返す。

s.dropna()
nullのデータを排除したSeriesを返す。

Seriesはs[booleanの配列]でフィルタリングすることができる。

DataFrameのカラム名もしくはインデックス名を指定してデータを削除する
df.drop()を利用する

s.isin()
値がSeries内に存在するか

s.unique()
値をユニークにする

s.value_counts() 値をインデックスにする。
その個数を値にする。
データフレームに適用
df.apply(pandas.value_counts).fillna(0)


# カラムに該当するデータを削除
df.drop(col_value, 1)
# 行に該当するデータを削除
df.drop(row_value, 0)

df.stack(level=-1, dropna=True)
列のカラム名を行のインデックス名に移動する
MulitiIndexの場合は階層を指定する

df.unstack(level=-1, fill_value=None)
行のインデックス名を列のカラム名に移動する
MulitiIndexの場合は階層を指定する

df.sum()はデータフレームの縦軸か横軸の合計のSeriesを返す。

ソート
s.argsort()
値でソートした結果のソートする前のインデックスを値にしたSeriesを返す。インデックス名は変わらない。
df.sort_index()
ラベルでソートする。
df.sort_values()
指定したラベルの値でソートする。
s.order()
Seriesを値でソートする
df.rank
s.rank()
インデックスはそのままで値に順位を入れる


df.take()
s.take()
指定したインデックスのデータをスライスする。

df.plot()

groupBy
df.groupBy('foo').bar.sum()

def func(group):
    pass
# gropにはdfをcol1, col2の値ごとに区切ったデータフレームが入る
df.groupBy(["col1", "col2"]).apply(func)


df.corr()
df.corrwith()
相関

df.cov()
共分散



欠損値
df.dropna()
欠損値がある軸を削除
howやthreshで調整

s.fillna() 欠損値を穴埋めする inplaceでコピーを制御
methodで穴埋め方法

s.isnull()
欠損値がTrue、それ以外がFalseでインデックス名はそのままのSeriesを返す

s.notnull()
欠損値がFalse、それ以外がTrueでインデックス名はそのままのSeriesを返す


foo_series = df['foo']
# filter
bar_series = foo_series[foo_series == 'bar']
v = df['foo'][8]
# 値の数を集計する
df['foo'].value_counts()
# カラムから抽出
df['a']
df[['a', 'b']]
df.a
# インデックスから抽出
df[0:3]
# ixから
# 0行目をSeriesで取得
df.ix[0]
df.ix[3, 3]
df.ix[1:3, 2:3]
df.ix[[1,2,3], [4,5]]
df.ix['r1':'r2', 'c3':'c4']
# dfの引き算でSeriesをdfに加える
df['diff'] = df['a'] - df['b']
# インデックスを抽出
indexs = df.index[df.point >= 70]


MultiIndex

# 2階層目の3番目の値を取得
s[:, 3]
df = s.unstack()
s = df.stack()

df = DataFrame(numpy.arange(16).reshape(4, 4),
                index=[['A', 'A', 'B', 'B'], [1, 2, 3, 4]],
                columns=[['C', 'C', 'D', 'D'], [1, 2, 3, 4]])

df.index.names = ['foo1', 'foo2']
df.columns.names = ['bar1', 'bar2']

# インデックスの階層を入れ替える
df.swaplevel('foo1', 'foo2')
# インデックス名だけソート
df.sortlevel(0)
# 階層ごとに関数を適応するときはlevelキーワードを使用する
df.sum(level="foo2")

df.loc[('A', 2)]
# [3, 4, 5]

df.index = pd.MultiIndex([['A', 'A', 'B', 'B'], [1, 2, 3, 4]])


データの保存

# headerが無い場合
df = pd.read_csv('foo.csv', names=['a', 'b', 'c', 'd'], index_col='a')
# csvで保存
df.to_csv('foo.csv')

# pickle形式で保存
df.save('foo_pickle')
df = pd.load('foo_pickle')

# HDF5形式で保存
hdf5 = pd.HDFStore('foo.h5')
hdf5['bar'] = df


DataFrameの統合
df.merge(right, how=’inner’, on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=(‘_x’, ‘_y’), copy=True, indicator=False)
特定の列の値が等しい場合、行を連結する
onで対象となるカラム名を指定する
how=outerで外部結合(union)になる
left_on='foo'right_on='bar'でfoo列とbar列の値で結合する
left_onright_onは配列を指定することができる   how=leftleft outer joinになる
how=rightright outer joinになる
right_index=Trueright_onの代わりにindexの値を名寄せに使用する
left_index=Trueleft_onの代わりにindexの値を名寄せに使用する

df.join(other, on=None, how=’left’, lsuffix=’’, rsuffix=’’, sort=False)
簡単にindexで結合する

pandas.concat(objs, axis=0, join=’outer’, join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, copy=True)
横方向もしくは縦方向にデータを積んでいく
join=innerで内部結合
join_axes=['foo', 'bar']で結合する軸を指定する
keys=["s1", "s2"]で結合もとのデータ毎にインデックスやカラムをつける。unstack()を利用すると便利
pd.concat({'s1': s1, 's2': s2})はkeysと同じ
ignore_indexで元データのインデックスを無視する

pd.concat([s1, s2], keys=['a', 'b'])

df.combine_first(other)
欠損値を埋めていく

置換
df.DataFrame.replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method=’pad’, axis=None)
値を置き換える
df.replace({'from': 'to'})

カラムやインデックスを置換する
df.rename(index=None, columns=None, **kwargs)

df.rename(index=pd.str.title)
df.rename({'foo': 'bar'})

データを区切る(Categorical)
データを決められた値に分類する
1-5 6-10 11-15に分類する
c = pd.cut(data, [0, 5, 10, 15])

データをデータの値の大きさで等間隔に分類する
c = pd.cut(data, 4)

データの数で等間隔に分割する c = pd.qcut(data, 4)
上記と同じ
c = pd.qcut(data, [0, 0.25, 0.5, 0.75, 1])