2017-10-11 9 views
1

私はpandas.date_rangeから生成されたDatetimeIndexに基づいて、マルチインデックスDataFrameにいくつかの集約をしようとしています。 DatetimeIndexパンダMultiIndex集約

     value 
date   id  
2000-05-31 1  0 
       2  1     
       3  1 
2000-06-30 2  1 
       3  0 
       4  0 
2000-07-30 2  1 
       4  0 
       1  0 
2002-09-30 1  1 
       3  1 

日付は、日付インデックスであってもなくてもよい:DateFrameはこのようになります

DatetimeIndex(['2000-05-30', '2000-05-31', '2000-06-01' ... '2001-1-31']) 

そして、私のマルチインデックスを:

は私のDatetimeIndexは、このようになります。

value==1のパーセンテージがいくつかの10進数のしきい値以上になるようにidをすべて取得する必要があります。そのidの日付がDatetimeIndexにあるすべての行については、0.6です。例えば

閾値が0.5ある場合、出力は[2, 3]又は23を含むいくつかのDataFrameであるべきです。

1は、2002-09-30DatetimeIndexにないため、要件を満たしていません。

私は、各IDに対してvalue==1の頻度を記録するためのループと2分の1の解決策を持っていますが、非常に遅く実行されます。

pandasを使用してこの集約を実行するにはどうすればよいですか?

ありがとうございます。

答えて

1

あなたが使用することができます。

#define range 
rng = pd.date_range('2000-05-30', '2000-7-01') 

#filtering with isin 
df = df[df.index.get_level_values('date').isin(rng)] 

#get all treshes 
s = df.groupby('id')['value'].mean() 
print (s) 
id 
1 0.0 
2 1.0 
3 0.5 
4 0.0 
Name: value, dtype: float64 

#get all values of index by tresh 
a = s.index[s >= 0.5].tolist() 
print (a) 
[2, 3] 
+0

を、私は私の質問は少し不明であったと思うが、私はDATE_RANGE内のすべての日付の平均値> 0.6でIDを取得しようとしています – bphi

+0

はい、あなたは正しいです。いくつかのことは私には不明でした。 rng = pd.date_range( '2000-05-30'、 '2000-7-01') 'と範囲' 0.5'のサンプルデータの出力はどれですか? – jezrael

+0

id 1は、date_range、平均(id 2)= 1、平均(id 3)= 0.5、平均(id 4)= 0の日付の平均値が0です。したがって、しきい値が0.5の場合、 2、3' – bphi

関連する問題