合并60分钟数据集至numpy数组/pandas DataFrame遇阻求助
解决数据集合并与cumsum操作问题
问题根源
numpy数组合并失败
你用ch1_total.append(c)把每个子数组塞进列表,最后得到的是存着多个ndarray的列表,不是合并后的单一数组。
DataFrame只保留最后一组数据
每次循环里df = pd.concat([df1], ignore_index=True)都是用当前的df1覆盖之前的df,相当于每次都重新创建一个只包含当前数据集的DataFrame,自然只剩最后一组。另外你注释掉的df_ch1.append其实是正确的思路,但没用到。
还有个小问题:data1.rolling(12).sum() / 12这行没有赋值,滚动求和的结果根本没保存,等于白跑了。
修正方案
方案1:合并为numpy ndarray
把所有子数组收集到列表后,用np.concatenate合并成单一数组,再做cumsum:
ch1_total = [] for filename, l in zip(filenames, L): if ch1: cont = np.loadtxt(filename, skiprows=ch1Start, max_rows=ch1N) t = cont[:, 0] + TimeOld c = cont[:, 1] * ch1M + resetCh1 # 保存滚动求和结果(如果需要的话) c_rolled = pd.Series(c).rolling(12).sum() / 12 c_rolled = c_rolled.dropna().values # 去掉滚动产生的NaN ch1_total.append(c_rolled) resetCh1 = c[-1] # 合并所有子数组为单一ndarray ch1_combined = np.concatenate(ch1_total) # 执行cumsum ch1_cumsum = ch1_combined.cumsum()
方案2:合并为pandas DataFrame
直接在循环里把每个子DataFrame收集到列表,最后一次性concat(效率更高):
df_list = [] for filename, l in zip(filenames, L): if ch1: cont = np.loadtxt(filename, skiprows=ch1Start, max_rows=ch1N) t = cont[:, 0] + TimeOld c = cont[:, 1] * ch1M + resetCh1 data1 = pd.DataFrame(c, columns=['intensity']) # 保存滚动求和结果 data1 = data1.rolling(12).sum() / 12 data1 = data1.dropna() # 去掉NaN df_list.append(data1) resetCh1 = c[-1] # 一次性合并所有子DataFrame df_ch1 = pd.concat(df_list, ignore_index=True) # 执行cumsum df_ch1['cumsum_intensity'] = df_ch1['intensity'].cumsum()
关键注意点
- 滚动求和会产生前11个NaN(因为窗口是12),记得用
dropna()清理,或者根据需求保留并处理。 - 用列表收集所有子数据集后再一次性合并,比循环里每次append/concat效率更高,尤其是数据量大的时候。
内容的提问来源于stack exchange,提问作者user24
相关产品推荐
相关产品推荐

