Pandasの操作

(2018-06-13)

SeriesとDataframe

import pandas as pd
import numpy as np

s = pd.Series([1,3])
print(s[1]) # 3
print(s.values) # [1 3] (ndarray)

dates = pd.date_range('2014-11-01 10:00',periods=3, freq='2H')
print(dates) 
# DatetimeIndex(['2014-11-01 10:00:00', '2014-11-01 12:00:00', '2014-11-01 14:00:00'], dtype='datetime64[ns]', freq='2H')

datestr = lambda d: pd.to_datetime(d).strftime('%Y-%m-%d %H:%M')

df = pd.DataFrame({
    'A' : 1.,
    'B' : pd.Series(range(6),  index=pd.date_range('2014-11-01 10:00',periods=6, freq='H')),
    'C' : [9, 1, 5],
}, index=dates)

df2 = pd.DataFrame({
    'D' : range(3),
}, index=dates)

print(df)
|(index)            |A  |B|C|
|-------------------|---|-|-|
|2014-11-01 10:00:00|1.0|0|9|
|2014-11-01 12:00:00|1.0|2|1|
|2014-11-01 14:00:00|1.0|4|5|

indexを指定しないと0始まりの数値になる。

取得

print(df['B'].values) # [0 2 4] (列)
print(df.loc[dates[0]].values) # [ 1.  0.  9.] (行)
print(df['2014-11-01 11:00:00':'2014-11-01 13:00:00'].values) # [[ 1.  2.  1.]] (index指定で複数行)
print(len(df[df.C > 3])) # 2 (条件で複数行)

ソート

print(df.sort_index(
    axis=1, # 行
    ascending=False # 降順
).iloc[0].index.values) # ['C' 'B' 'A']
print(list(map(datestr, df.sort_values(by='C').iloc[:2].index))) # ['2014-11-01 12:00', '2014-11-01 14:00']

takeでランダムに取ってreset_indexで振り直せばシャッフルできる。

numpyの関数 - sambaiz-net

print(df.take(np.random.permutation(df.index)).reset_index(drop=True))

結合

indexでjoinする。

print(df.join(df2, how='outer'))
|(index)            |A  |B|C|D|
|-------------------|---|-|-|-|
|2014-11-01 10:00:00|1.0|0|9|0|
|2014-11-01 12:00:00|1.0|2|1|1|
|2014-11-01 14:00:00|1.0|4|5|2|

値でjoinする。

print(pd.merge(df, df2, left_on='C', right_on='D', how='left'))
|(index)            |A  |B|C|D  |
|-------------------|---|-|-|---|
|2014-11-01 10:00:00|1.0|0|9|NaN|
|2014-11-01 12:00:00|1.0|2|1|1.0|
|2014-11-01 14:00:00|1.0|4|5|NaN|

集計

print(df.mean().values) # [ 1.  2.  5.]
print(df.apply(
    lambda x: x.max(), 
    axis=0 #  列
).values) # [ 1.  4.  9.] (=df.max())

加工

KaggleのTitanicのチュートリアルをランダムフォレストで解く - sambaiz-net

print(df.drop(
    ['A', 'B'],
    axis=1 # 行
)) # 不要なカラムを削除
|(index)            |C|
|-------------------|-|
|2014-11-01 10:00:00|9|
|2014-11-01 12:00:00|1|
|2014-11-01 14:00:00|5|
df['D'] = df['C'].shift(1) # Cを一列ずらしたDを追加
df['D'] = df['D'].fillna(df['D'].mean()).astype(int) # NaNになる1行目はほかの平均で埋める
print(df)
|(index)            |A  |B|C|D|
|-------------------|---|-|-|-|
|2014-11-01 10:00:00|1.0|0|9|5|
|2014-11-01 12:00:00|1.0|2|1|9|
|2014-11-01 14:00:00|1.0|4|5|1|

ファイル入出力

df.to_csv('df.csv', header=True, index_label='date')
'''
date,A,B,C
2014-11-01 10:00:00,1.0,0,9
2014-11-01 12:00:00,1.0,2,1
2014-11-01 14:00:00,1.0,4,5
'''
df3 = pd.read_csv('df.csv', index_col=0)
print(df3.index.values) # ['2014-11-01 10:00:00' '2014-11-01 12:00:00' '2014-11-01 14:00:00']