2017-05-23 10 views
2

私は複数のインデックスを持つデータを持っています。ここにサンプルがあります。ここでマルチインデックスデータフレームで同時に2つのスライスを実行するにはどうすればよいですか?

Subject  Date  x 
00001-SHC-1 2016-09-30 5 
00002-SHC-1 2016-09-30 6 
00003-SHC-1 2016-09-30 5 
00005-SHC-1 2016-09-30 5 
00006-SHC-1 2016-09-30 3 

SubjectDateは私のインデックスです。私は2番目の日付範囲の観測を含めるしたい場合、私は

df.loc[(slice(None), slice('2016-09-01','2016-10-01')),:]

が、何を使用して、特定の日付範囲内のすべての観測値を取得するためのデータフレームをスライスすることができますか? '2016-09-01''2016-09-30'の間のすべての観測値と、'2017-01-01''2017-01-31'の間のすべての観測値をスライスしたい場合はどうなりますか?

+0

。短い答えははいです、それは非常に可能です。 –

+0

@MadPhysicist私は、私が考えることができる他の方法よりもあまり冗長ではないように見えるので、スライスを使用しています。あなたは私があなたが思っていることの例を教えてくれますか? –

+0

日付スライスの代わりにブール値配列を使う: '((df.index <'...')&(df.index> '...'))のようなもの| (df.index> '...')&(df.index <'...')) 'ここで、必要な正確な日付範囲を与えるためにその式を設定します。 –

答えて

2

あなたはまた、query()メソッドを使用することができます。

代わりに、あなたはインデックスが日付があなたの基準にマッチしたところ見つけることによって得られるインデックス配列を、作成することができ、明示的にスライスを使用しての
In [81]: df 
Out[81]: 
         x 
Subject  Date 
00001-SHC-1 2016-09-01 5 
00002-SHC-1 2016-09-30 6 
00003-SHC-1 2016-09-30 5 
00005-SHC-1 2016-12-01 5 
00006-SHC-1 2017-01-15 3 
00007-SHC-1 2017-03-22 5 

In [82]: df.query("'2016-09-01' <= Date <= '2016-09-30' or '2017-01-01' <= Date <= '2017-01-31'") 
Out[82]: 
         x 
Subject  Date 
00001-SHC-1 2016-09-01 5 
00002-SHC-1 2016-09-30 6 
00003-SHC-1 2016-09-30 5 
00006-SHC-1 2017-01-15 3 
+0

私はそれが好きです、ありがとう! –

+0

@DemetriP、あなたは大歓迎です:-) – MaxU

1

これはスライスを使用しない回答で、私にとってはうまく機能します。

dates = df.index.get_level_values(1) 

mask =((dates>='2016-09-01')&(dates<='2016-09-30'))|((dates>='2017-01-01')&(dates<='2017-01-31')) 

df.loc[ 

    (slice(None), mask),: 
] 
関連する問題