pandas如何用另一DataFrame索引重索引,按窗口求和填充target列值
正确实现代码
你要实现的是按df1的索引作为时间窗口的左边界,对每个窗口内的df0.target值求和,用pd.cut + 分组求和的方案即可,支持df1索引为不规则时间的场景:
import pandas as pd import numpy as np # 你的示例初始化代码 df0 = pd.DataFrame(index=pd.date_range(start='2018-10-31 00:17:24', periods=50,freq='1s')) df1 = pd.DataFrame(index=pd.date_range(start='2018-10-31 00:17:24', periods=50,freq='20s')) df0['dat'] = np.random.rand(len(df0)) df0['target'] = 0 df0.loc[(df0['dat'] >= 0.5), 'target'] = 1 # ------------------- 核心实现 ------------------- # 1. 构造时间窗口边界:左闭右开,最后补充一个边界覆盖df0的最大时间 bins = df1.index.append(pd.Index([df0.index.max() + pd.Timedelta(seconds=1)])) # 2. 给df0的每行打分组标签,对应所属的df1索引 df0['group'] = pd.cut(df0.index, bins=bins, labels=df1.index, right=False) # 3. 按分组求和target,赋值给df1 df1['target_sum'] = df0.groupby('group')['target'].sum()
如果你的df1索引是固定规则的20秒间隔,也可以直接用重采样语法简化:
df1['target_sum'] = df0.resample('20S', label='left', closed='left')['target'].sum()
原代码问题说明
你原来的写法逻辑不符合需求:
reindex + interpolate是用来补全缺失值做插值的,和按窗口求和的需求完全不匹配- 最后调用
sum()是对整个DataFrame的所有行做全局求和,得到的是整列的总累加值,自然不是每个窗口的单独求和结果。
内容的提问来源于stack exchange,提问作者jokerp
相关产品推荐
相关产品推荐

