2 つのデータフレームがあります。各行について、一致するものを検索し、対応する値を取得df
したいと考えています。epoch_minute - lag
average_hc
>>> df.head()
epoch_minute headcount
0 25640940 8
1 25640939 7
2 25640938 6
3 25640937 10
4 25640936 11
>>> avgs.head()
epoch_minute average_hc
0 25640940 7.8
1 25640939 8.5
2 25640938 9.2
3 25640937 10.0
4 25640936 10.1
この for ループはトリックを行います。
lag = []
for i,r in df.iterrows():
l = avgs.loc[avgs['epoch_minute'] == (r['epoch_minute'] - day), 'average_hc']
lag.append(l) if not l.empty else np.nan
avgs['lag'] = pd.Series(lag).astype('float')
この正しい Series を生成しますlag
。
epoch_minute average_hc lag headcount
0 25640940 7.8 30.2 8.0
1 25640939 8.5 28.1 7.0
2 25640938 9.2 26.2 6.0
3 25640937 10.0 24.7 10.0
4 25640936 10.1 23.1 11.0
操作と同じロジックを試すとapply
:
lag1 = df.apply(lambda r: avgs.loc[avgs['epoch_minute'] == (r['epoch_minute'] - day),
'average_hc'], axis=1)
print(f"lag1.shape: {lag1.shape}\nlag1.head():\n{lag1.head()}")
私が期待していたシリーズの代わりに、この正しく評価されたが間違った形状のデータフレームが生成されます。
1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 ... 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664
0 30.200001 NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 NaN 28.1 NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 NaN NaN 26.299999 NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
3 NaN NaN NaN 24.799999 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
4 NaN NaN NaN NaN 23.1 NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
ナンを削除するか、によって返されるデータフレームを平坦化してapply
、対角値のシリーズにする方法を教えてください。