为何pandas.DataFrame.join未按预期工作?索引匹配后行数异常
问题原因分析
你的核心问题出在重复索引匹配和中间步骤的行数变化上:
- 原始
inverters存在大量重复的三层索引(Time (ps),n_TDC,signal),总行数为4502709。 - 你的处理流程中,
_的行数意外变为269973(推测是某一步操作中对重复索引的行进行了隐式去重,或索引对齐时只保留了唯一索引组合的行)。 - 当执行
inverters.join(_)时,pandas默认使用左连接(left join):保留左侧inverters的所有行,将右侧_中匹配索引的值广播到所有对应重复行,因此最终行数和原始inverters一致,而非_的行数。
解决方案:生成与inverters同行数的归一化列
不需要复杂的索引重置操作,直接通过分组变换(transform)实现组内归一化,确保结果与原DataFrame行数一致:
# 直接在原DataFrame上生成归一化列,避免索引问题 inverters['Voltage (normalized)'] = inverters.groupby(['n_TDC', 'signal'])['Voltage (ADCu)'].transform( lambda x: (x - x.min()) / (x.max() - x.min()) )
代码说明:
groupby.transform()会对每个分组内的元素执行计算,并将结果广播回原DataFrame的对应行,保证行数与原DataFrame完全一致。- 公式
(x - x.min()) / (x.max() - x.min())实现了组内的0-1归一化,避免你原代码中可能出现的除以0问题(若组内所有值相同,会返回NaN,可根据需求处理)。
验证结果
执行上述代码后,inverters将保留原始4502709行,新增的Voltage (normalized)列会对应每一行的归一化值,完全符合你“按索引匹配横向拼接”的需求。
内容的提问来源于stack exchange,提问作者user171780
相关产品推荐
相关产品推荐

