Pandas合并不同采样率DataFrame报错及效率优化问题咨询
异采样率DataFrame合并优化方案
原有代码问题分析
- 报错原因:
ValueError: The truth value of an array with more than one element is ambiguous是因为你在循环过程中不断删除行修改原DataFrame,导致索引混乱,wholedf.at[myrow,'TIME_DIFFERENCE']实际取到了多个值组成的数组,无法直接做布尔判断。 - 性能问题:循环内逐行drop行的时间复杂度为O(n²),数据量稍大就会出现运行极慢的问题。
更高效的矢量化解决方案
核心思路是利用pandas分组操作直接过滤掉每秒多余的1行数据,全程无循环,百万行数据也可在秒级完成处理:
- 先统一两个DataFrame的时间列格式
import pandas as pd # 待降采样DataFrame df_raw = pd.read_csv("你的待降采样数据路径", parse_dates=["TIME"]) # 基准10Hz DataFrame df_base = pd.read_csv("你的基准数据路径", parse_dates=["TIME"])
- 过滤待降采样DataFrame的多余行,统一为10Hz
# 按整秒对数据分组,给每组内的行生成序号 df_raw['second_group'] = df_raw['TIME'].dt.floor('s') df_raw['inner_seq'] = df_raw.groupby('second_group').cumcount() # 保留每组前10行,直接去掉每秒多余的第11行 df_raw_10hz = df_raw[df_raw['inner_seq'] < 10].copy()
- 时间对齐后合并
如果需要更精准的时间匹配,可给处理后的待降采样数据补毫秒偏移,再用merge_asof做近邻合并:
# 给每组内的行加100ms的时间偏移,模拟10Hz的毫秒级时间戳 df_raw_10hz['adjusted_time'] = df_raw_10hz['second_group'] + pd.to_timedelta(df_raw_10hz['inner_seq'] * 100, unit='ms') # 按最近时间合并两个DataFrame df_merged = pd.merge_asof( df_base.sort_values('TIME'), df_raw_10hz.sort_values('adjusted_time'), left_on='TIME', right_on='adjusted_time', direction='nearest' )
原有代码修复方案(不推荐,仅作参考)
如果要保留原有逻辑,需要把待删除索引先收集起来,循环结束后一次性删除,同时用iloc按位置取值避免索引混乱:
drop_indexes = [] resetcounter = 1 row0 = 0 for myrow in range(len(wholedf)): sepe = wholedf.iloc[myrow]['TIME_DIFFERENCE'] if sepe != 0.0: resetcounter = 1 row0 = myrow if resetcounter > 11: drop_indexes.append(wholedf.index[row0]) resetcounter += 1 # 一次性删除所有冗余行 wholedf = wholedf.drop(drop_indexes)
内容的提问来源于stack exchange,提问作者Leopold Wahlbeck
相关产品推荐
相关产品推荐

