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

pd.merge合并传感器数据集仅单条行生效未更新全量数据

问题根因

你这代码两个硬伤,直接导致merge结果完全不对:

  1. pd.merge用法完全错误:你没指定合并关联键的时候,pandas会自动找两个输入对象的同名列做等值匹配,你生成的test_data_pre1是仅包含AcX列的Series,最终合并逻辑就是拿原表未清洗的AcX值和清洗后的AcX值做相等判断,根本不是你以为的按行对齐替换列。只要两边值对不上就匹配失败,碰到重复值还会生成笛卡尔积,最后只剩零星随机匹配上的行完全符合这个错误特征。
  2. CSV读入逻辑从根上就错了:看你给的原始数据样例,每行只有两部分:第一列是时间戳,第二列是带b'前缀的字节格式字符串,里面塞了5个空格分隔的传感器数值。你直接硬指定6个列名读入,会把整个字节串全塞进AcX列,后面的AcY/AcZ/FSR相关列全是空值,数据一开始就读歪了。
正确修复方案

这种「处理单列后替换原列」的场景根本不需要用pd.merge,直接给原表列赋值就行,先把读数据的逻辑修正,再做清洗:

import pandas as pd

# 1. 先正确读入原始数据,按空白分割,原始数据每行仅2个字段:时间戳、传感器原始字节串
raw_data = pd.read_csv(
    'live_data.csv',
    sep=r'\s+',
    names=['timestamp', 'sensor_raw'],
    header=None
)

# 2. 解析字节串里的5个传感器值,顺便去掉b'、单引号等冗余字符
def parse_sensor_content(content_str):
    cleaned_content = content_str.replace("b'", "").replace("'", "").split()
    return pd.Series(cleaned_content, index=['AcX', 'AcY', 'AcZ', 'FSR A', 'FSR B'])

# 拼接得到结构化的传感器数据集
sensor_parsed = raw_data['sensor_raw'].apply(parse_sensor_content)
test_data_pre = pd.concat([raw_data[['timestamp']], sensor_parsed], axis=1)

# 3. 如果需要单独清洗AcX列,直接赋值回原列即可,不需要合并
test_data_pre['AcX'] = test_data_pre['AcX'].apply(lambda x: str(x).replace("'", ""))

补充:如果非要用merge实现按行对齐(完全不推荐,属于冗余操作),必须给两边数据加唯一行标识作为关联键,否则永远会出现匹配错误,示例写法如下:

# 仅作原理参考,实际开发不要这么写
test_data_pre['row_id'] = test_data_pre.index
processed_acx = test_data_pre['AcX'].apply(lambda x: str(x).replace("'", "")).reset_index().rename(columns={'index':'row_id', 'AcX':'AcX_cleaned'})
merged_res = pd.merge(test_data_pre, processed_acx, on='row_id')
问题对应截图
  • 传感器采集的原始实时数据:
    传感器采集的原始实时数据
  • AcX列处理后的中间结果:
    AcX列处理后的结果
  • 错误使用pd.merge得到的异常结果:
    执行pd.merge后出现的异常结果

内容的提问来源于stack exchange,提问作者billnumber1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 12:09:12