Pandasの操作
pythonSeriesと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で振り直せばシャッフルできる。
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())
groupbyもできる。
df3 = pd.DataFrame({
'A' : [0, 1, 0, 0, 1],
'B' : [2, 2, 2, 4, 4],
'C' : [2, 4, 6, 8, 10]
})
print(df3.groupby(['A', 'B'])['C'].sum()[0, 2]) # 2 + 6 = 8
加工
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
'''
pd.read_csv('df.csv', parse_dates=True, index_col=["date"], na_values=[0])