次のようにシリアル番号ごとに時系列データを持つような場合に,シリアル番号ごとに処理をしたいときのループの書き方。
import pandas as pd
df = pd.read_csv('sample.csv')
df
Date Serial_No Var1 Var2 Var3
0 2016-04-01 1 0.708636 0.014882 0.765210
1 2016-04-02 1 0.211528 0.012070 0.071375
2 2016-04-03 1 0.745620 0.211446 0.593242
3 2016-04-04 1 0.378551 0.249341 0.899383
4 2016-04-05 1 0.692113 0.800209 0.573121
5 2016-04-01 2 0.942247 0.047866 0.476508
6 2016-04-02 2 0.440591 0.098763 0.998441
7 2016-04-03 2 0.339409 0.784255 0.918570
8 2016-04-04 2 0.867678 0.691103 0.820591
9 2016-04-05 2 0.281377 0.627040 0.328517
10 2016-04-01 3 0.493448 0.628469 0.728271
11 2016-04-02 3 0.792600 0.546174 0.519287
12 2016-04-03 3 0.537685 0.235136 0.509063
13 2016-04-04 3 0.691400 0.028834 0.663123
14 2016-04-05 3 0.625309 0.734726 0.077092
例えば,シリアル番号ごとにVar1を規格化(平均0,標準偏差1)したい場合。インデックスをシリアル番号にして,シリアル番号でインデクシングする。
df.index = df['Serial_No']
for sn in set(df.index):
mean = df.ix[sn, 'Var1'].mean()
std = df.ix[sn, 'Var1'].std()
df.ix[sn, 'Var1'] = (df.ix[sn, 'Var1'] - mean) / std
次のような書き方をすると,コピーされたDataFrameに対して処理をしてしまい,データの更新ができていないため注意。
df = pd.read_csv('sample.csv')
for sn in set(df['Serial_No']):
mean = df[df['Serial_No'] == sn]['Var1'].mean()
std = df[df['Serial_No'] == sn]['Var1'].std()
df[df['Serial_No'] == sn]['Var1'] = (df[df['Serial_No'] == sn]['Var1'] - mean) / std # これはダメ