2017-10-11 128 views
1

我想根据从pandas.date_range生成的DatetimeIndex对多指数DataFrame做一些聚合。熊猫多元指数聚合

DatetimeIndex看起来是这样的:

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

我的多指标DateFrame看起来是这样的:

     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 

DatetimeIndex日期可能会或可能不会在日期索引

我需要检索所有id,以便value==1的百分比大于或等于某个小数阈值,例如, 0.6所有行,其中对于id日期是在DatetimeIndex

例如,如果阈值是0.5,则输出应该是[2, 3]或一些DataFrame含有23

1不符合要求,因为2002-09-30不在DatetimeIndex中。

我有循环和dictonaries的解决方案来跟踪多久value==1每个ID,但它运行速度非常慢。

我怎样才能利用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

我想我的问题是有点不清楚,但我试图用一个均值> .6获得IDS在DATE_RANGE所有日期 – bphi

+0

是的,你是对的。有些事情我不清楚。样本数据'rng = pd.date_range('2000-05-30','2000-7-01')和范围'0.5'的期望输出是什么? – jezrael

+0

ID 1具有的0在DATE_RANGE日期的平均,平均(ID 2)= 1,平均(ID 3)= 0.5和平均(ID 4)= 0因此,如果阈值是0.5,则输出应该是' 2,3' – bphi