df.xs(lbl)
すべてのインデックスが等しいDataFrameの行にアクセスするために使用できることは知っていlbl
ますが、次の問題があります。
T
次のように時系列(sの単純なシーケンシャル)list
を反復できるようにしたいと思いdatetime
ます。
ここdfA
で、はすべてによってインデックス付けされたデータフレームT
であり、すべてではないがdfB
からの複数の(いくつかの繰り返し)インデックスを持つデータフレームですT
T
for t in T:
for r in dfB.xs(t).iterrows():
# do something with r on values in dfA @ t
# do something else with values in dfA @ t
私が抱えている問題は次のとおりです。
- にない場合
t
はdf
、aKeyError
が発生します。 t
inのエントリが1つしかない場合df
、Series
オブジェクトは結果になります- に複数ある場合、オブジェクトが生成
t
されますdf
DataFrame
ご覧のとおり、これにより、かなり単純なはずのコードがかなり醜くなります。これを行うにはもっとパンダシックな方法があるはずですが、それは私には明らかではありません。
アップデート:
次のようにダンプT
しdfB
ます。
注:T
元のコードをに変更しましたDatetimeIndex
が、これによって元の前提が変更されることはありません。
In [26]: T
Out[26]:
<class 'pandas.tseries.index.DatetimeIndex'>
[2000-03-15 00:00:00, ..., 2012-12-26 00:00:00]
Length: 3191, Freq: None, Timezone: None
In [27]: orders #equivalent to dfB
Out[27]:
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 15322 entries, 2000-03-15 00:00:00 to 2012-12-27 00:00:00
Data columns:
Symbol 15322 non-null values
Type 15322 non-null values
Number 15322 non-null values
dtypes: int64(1), object(2)
これは、元のコードスニペットを機能させるのに十分なデータpandas
です。
さらに、dfB
場所に同じ値の複数のインデックスが含まれていることを示すには、次のようにします。
In [30]: orders.xs(t) #equivalent to dfB.xs(t)
Out[30]:
Symbol Type Number
Date
2012-12-26 0596.HK Buy 1000
2012-12-26 0387.HK Buy 1000
2012-12-26 0342.HK Buy 1000
2012-12-26 0343.HK Buy 1000
2012-12-26 0491.HK Buy 1000