You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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行数据,全程无循环,百万行数据也可在秒级完成处理:

  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"])
  1. 过滤待降采样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()
  1. 时间对齐后合并
    如果需要更精准的时间匹配,可给处理后的待降采样数据补毫秒偏移,再用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 22:06:04