我有一个高度稀疏的数据帧(每行只有一个非零值),由非常规时间戳索引,我正在尝试执行以下操作。
对于给定列中的每个非零值,我想计算给定时间范围内其他列中其他非零值的数量。在某种程度上,我正在尝试计算类似于滚动 cross_tab的内容。
到目前为止我的解决方案是丑陋和缓慢的,因为我还没有想出如何使用切片和滚动来做到这一点。它看起来像:
delta = 1
values = pd.DataFrame(0,index= df.columns,columns= df.columns)
for j in df.columns:
for i in range(len(df[df[j]!=0].index)-1):
#min is used to avoid overlapping
values[j] +=df[(df.index<min((df[df[j]!=0].index + pd.tseries.timedeltas.to_timedelta(delta, unit='h'))[i],df[df[j]!=0].index[i+1]))&(df.index>=df[df[j]!=0].index[i])].astype(bool).sum()
values = values.T
和玩具示例数据框是:
df = pd.DataFrame.from_dict({"2016-01-01 10:00.00":[0,1],
"2016-01-01 10:30.00":[1,0],
"2016-01-01 12:00.00":[0,1],
"2016-01-01 14:00.00":[1,0]},
orient="index")
df.columns=['a','b']
df.index = pd.to_datetime(df.index)
a b
2016-01-01 10:00:00 0 1
2016-01-01 10:30:00 1 0
2016-01-01 12:00:00 0 1
2016-01-01 14:00:00 1 0
所需的输出应该是这样的(计数取决于timedelta):
a b
a 1 0
b 1 1
答案 0 :(得分:1)
很难说出你想要的是什么。但它听起来有点像这样
我想使用新功能pandas 0.19
。时间意识rolling
。为了使用它,我们需要一个排序索引。
d1 = df.sort_index()
现在,让我们假设我们想要在正负一小时内计算。让我们开始为索引的每个元素添加两个小时
d1.index = d1.index + pd.offsets.Hour(2)
然后我们会翻身,回顾四个小时。这将相对于原始指数向前看两小时和向后两小时。
d2 = d1.rolling('4H').sum()
d2.index = d2.index - pd.offsets.Hour(2)
d2
a b
2016-01-01 10:00:00 0.0 1.0
2016-01-01 10:30:00 1.0 1.0
2016-01-01 12:00:00 1.0 2.0
2016-01-01 14:00:00 2.0 1.0