DataFrame列值相减仅返回NaN问题排查求助
问题排查与解决
核心问题分析
- 行数不匹配导致合并后出现NaN:使用
pd.concat(axis=1)按列合并时,若各个DataFrame的行数不一致,行数较少的DataFrame对应的行会被填充为NaN。后续对包含NaN的列做减法,结果自然全是NaN。 - 文件读写路径/名称不匹配:你保存的文件是
merge27-31.csv,但读取的却是C:\\Users\\finalmerge27-31.csv,路径和文件名都不对应,大概率读取了错误的文件,导致列数据异常。 - 不必要的
reset_index操作:该操作会新增一列索引,对列间减法无帮助,反而可能引入额外干扰。
修正后的代码
import pandas as pd import numpy as np # 读取所有文件,注意路径格式(Windows用/或\\) df27 = pd.read_csv('D:/27.txt', names=['No27','X27','Y27','Z27','Date27','Time27'], sep='\s+') df28 = pd.read_csv('D:/28.txt', names=['No28','X28','Y28','Z28','Date28','Time28'], sep='\s+') df29 = pd.read_csv('D:/29.txt', names=['No29','X29','Y29','Z29','Date29','Time29'], sep='\s+') df30 = pd.read_csv('D:/30.txt', names=['No30','X30','Y30','Z30','Date30','Time30'], sep='\s+') df31 = pd.read_csv('D:/31.txt', names=['No31','X31','Y31','Z31','Date31','Time31'], sep='\s+') # 先检查所有文件的行数是否一致,这是按列合并的前提 print("各文件行数:") print(f"df27: {len(df27)}, df28: {len(df28)}, df29: {len(df29)}, df30: {len(df30)}, df31: {len(df31)}") # 确认行数一致后执行合并 total = pd.concat([df27, df28, df29, df30, df31], axis=1) # 直接在合并后的DataFrame上计算差值,无需重复读写文件 total['X31-X27'] = total['X31'] - total['X27'] total['Y31-Y27'] = total['Y31'] - total['Y27'] total['Z31-Z27'] = total['Z31'] - total['Z27'] # 查看计算结果 print(total[['X31', 'X27', 'X31-X27', 'Y31', 'Y27', 'Y31-Y27', 'Z31', 'Z27', 'Z31-Z27']]) # 若需保存文件,指定正确路径 total.to_csv('D:/merge27-31.csv', index=False)
额外注意事项
- 确保所有输入的txt文件每行数据是一一对应的(比如第1行都是同一测点的不同日期数据),否则按列合并没有意义,需要考虑按
No列作为主键进行merge操作。 - 若必须保存后再读取,务必保证保存和读取的路径、文件名完全一致。
- 如果检查行数后发现不一致,需要先核对原始数据,确认是数据缺失还是读取参数错误(比如分隔符、表头设置)。
内容的提问来源于stack exchange,提问作者Aqib
相关产品推荐
相关产品推荐

