pd.merge合并传感器数据集仅单条行生效未更新全量数据
问题根因
你这代码两个硬伤,直接导致merge结果完全不对:
pd.merge用法完全错误:你没指定合并关联键的时候,pandas会自动找两个输入对象的同名列做等值匹配,你生成的test_data_pre1是仅包含AcX列的Series,最终合并逻辑就是拿原表未清洗的AcX值和清洗后的AcX值做相等判断,根本不是你以为的按行对齐替换列。只要两边值对不上就匹配失败,碰到重复值还会生成笛卡尔积,最后只剩零星随机匹配上的行完全符合这个错误特征。- 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列处理后的中间结果:

- 错误使用pd.merge得到的异常结果:

内容的提问来源于stack exchange,提问作者billnumber1
相关产品推荐
相关产品推荐

