我有一个高度稀疏的数据帧(每行只有一个非零值)由非常规时间戳索引,我正在尝试执行以下操作。
对于给定列中的每个非零值,我想计算给定时间增量内其他列中其他非零值的数量。在某种程度上,我正在尝试计算类似于滚动 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
所需的输出应如下所示(计数取决于时间增量):
a b
a 1 0
b 1 1
最佳答案
很难说出你到底想要什么。但听起来有点像这样
我想使用 pandas 0.19
的新功能。时间感知滚动
。为了使用它,我们需要一个排序索引。
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
关于python - Pandas 中的滚动行过滤器/交叉表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42015635/