pandas按section_id合并问答行在本地数据集失效如何调整代码?
问题排查与解决方案
第一步:优先排查关联键section_id匹配失效问题
你试了merge返回空DataFrame,核心原因是type=1和type=2的section_id实际没有匹配项,你手动看到的「重复」大概率是类型差异、不可见字符、空格导致的视觉一致实际值不一致。
先执行以下校验代码:
# 检查两类数据的section_id类型是否一致 print("type=1的section_id数据类型:", data.loc[data['type'] == 1, 'section_id'].dtype) print("type=2的section_id数据类型:", data.loc[data['type'] == 2, 'section_id'].dtype) # 取你确认存在的共同section_id,打印实际值对比 test_sid = 24339851 # 替换成你手动确认存在的section_id print("问题行该id值:", data.loc[(data['type'] == 1) & (data['section_id'] == test_sid), 'section_id'].values) print("回答行该id值:", data.loc[(data['type'] == 2) & (data['section_id'] == test_sid), 'section_id'].values)
如果类型不一致、或者存在空格/不可见字符,执行统一清理:
import re # 统一转字符串,清理不可见字符、首尾空格 data['section_id'] = data['section_id'].astype(str).apply( lambda x: re.sub(r'[\x00-\x1F\x7F-\x9F]', '', x) ).str.strip()
第二步:优化合并逻辑
你之前的merge代码存在变量名错误(df.type未定义,应该是data.type),且没有处理多回答场景,优化后的代码如下:
# 拆分问题表、回答表 q_df = data[data['type'] == 1].copy() a_df = data[data['type'] == 2].copy() # 回答表只保留需要的字段,重命名避免冲突 a_df = a_df[['section_id', 'Ans', 'ans_t']].rename(columns={ 'Ans': 'Ans.1', 'ans_t': 'ans_t.1' }) # 若同一个section_id有多个回答,按需聚合(此处取第一个回答,可自行调整为拼接、取最新等逻辑) a_df = a_df.groupby('section_id', as_index=False).first() # 左连接保留所有问题行,没有对应回答的字段自动为空 merged_df = pd.merge(q_df, a_df, on='section_id', how='left')
关于非数字字段转NaN的问题
que_t、ans_t等字段如果不需要参与合并逻辑,仅用于后续计算,可以按你给出的方案替换非数字内容为NaN,不会影响合并结果。
内容的提问来源于stack exchange,提问作者id345678
相关产品推荐
相关产品推荐

