JupyterLab中移除NaN后DataFrame为空问题求助
问题根源与修复方案
核心问题分析
这段代码里有两处关键问题,导致移除NaN后DataFrame直接变空:
- 重复关联时间数据+内连接引发索引不匹配:先通过
join(deltaTime)关联了时间序列,之后又用how='inner'关联deltaTime_df,如果两个时间数据的索引无法完全匹配,内连接会直接过滤掉所有行。 - 冗余的NaN处理逻辑:
interpolate()已经能填充大部分NaN,之后的dropna()默认会删除任何包含NaN的行,如果数据中存在整行NaN的情况,或者插值后仍有全NaN列,就会意外删光所有数据。
修复后的完整代码
# 转换时间数据为分钟级数值 rawTime = pd.to_datetime(data.iloc[3:, 0], format='%m/%d/%Y %H:%M') # 修正时间单位:纳秒转分钟,用10**9(1秒=1e9纳秒) deltaTime = (rawTime - rawTime.iloc[0]).astype(np.int64) / (10**9 * 60) # 生成50个传感器名称 names = [f"GeoFlex{i}" for i in range(1, 51)] # 计算传感器数据的列索引范围 num_sensors = len(names) tiltX_cols = list(range(5, 5 + 4 * num_sensors, 4)) tiltY_cols = list(range(6, 6 + 4 * num_sensors, 4)) # 动态获取数据总行数 end_row = data.shape[0] # 提取X/Y轴倾斜数据并设置列名 tiltX = data.iloc[3:end_row, tiltX_cols].set_axis(names[:len(tiltX_cols)], axis="columns") tiltY = data.iloc[3:end_row, tiltY_cols].set_axis(names[:len(tiltY_cols)], axis="columns") # 转换为数值类型,无法转换的内容设为NaN tiltX = tiltX.apply(pd.to_numeric, errors='coerce') tiltY = tiltY.apply(pd.to_numeric, errors='coerce') # 线性插值填充NaN,优先保留现有数据 tiltX_interpolated = tiltX.interpolate(method='linear', axis=0) tiltY_interpolated = tiltY.interpolate(method='linear', axis=0) # 统一索引关联时间数据,避免索引不匹配 deltaTime_df = pd.DataFrame(deltaTime, index=rawTime.index, columns=['deltaTime']) tiltXWithoutNaN = tiltX_interpolated.join(deltaTime_df) tiltYWithoutNaN = tiltY_interpolated.join(deltaTime_df) # 可选:如果仍有零星NaN,仅删除传感器数据列含NaN的行(谨慎使用) # tiltXWithoutNaN = tiltXWithoutNaN.dropna(subset=names[:len(tiltX_cols)]) # tiltYWithoutNaN = tiltYWithoutNaN.dropna(subset=names[:len(tiltY_cols)])
关键修复说明
- 修正时间计算错误:原代码中
10e8*60的单位转换有误,纳秒转分钟应该用10**9 * 60,确保时间差数值准确。 - 统一索引逻辑:用
rawTime的索引创建deltaTime_df,和tiltX/tiltY的索引完全对齐,避免关联时出现索引不匹配的问题。 - 简化NaN处理流程:先完成插值填充,再关联时间数据,去掉重复的
join和冗余的类型转换;如果需要删除剩余NaN,指定仅针对传感器数据列操作,避免误删有效数据。 - 移除冗余操作:删掉了重复关联时间数据的代码,避免多次操作导致的索引混乱。
内容的提问来源于stack exchange,提问作者naiyaluna
相关产品推荐
相关产品推荐

