Swift DataFrame中nil值的前向/后向填充方案技术问询
Swift DataFrame 中Nil值的前向/后向填充方案
你提到当前实现的前向填充无法处理连续nil值,核心原因大概率是你使用的DataFrame库的transformColumn方法采用了并行遍历,导致外部变量pre的状态被并发修改,无法正确留存上一个非nil值。下面是可靠的实现方案:
前向填充(Forward Fill)
先将列数据提取为数组,按顺序串行处理,确保状态正确:
// 提取目标列数据,需适配你使用的DataFrame库的列读取方法 guard var columnValues = dataframe["columnName"] as? [Double?] else { fatalError("目标列类型不匹配,请检查列名或数据类型") } var lastValid: Double? = nil for idx in columnValues.indices { if let current = columnValues[idx] { lastValid = current } else { columnValues[idx] = lastValid } } // 将处理后的数据写回DataFrame dataframe["columnName"] = columnValues
后向填充(Back Fill)
从后往前遍历,用后续的非nil值填充前面的nil:
guard var columnValues = dataframe["columnName"] as? [Double?] else { fatalError("目标列类型不匹配") } var nextValid: Double? = nil // 反向遍历数组索引 for idx in columnValues.indices.reversed() { if let current = columnValues[idx] { nextValid = current } else { columnValues[idx] = nextValid } } dataframe["columnName"] = columnValues
封装成可复用的扩展
如果需要频繁使用,可以给你的DataFrame类型封装泛型扩展方法,适配更多可选数据类型:
extension DataFrame { func forwardFill<T>(column name: String) { guard var values = self[name] as? [T?] else { return } var lastValid: T? = nil for idx in values.indices { if let val = values[idx] { lastValid = val } else { values[idx] = lastValid } } self[name] = values } func backwardFill<T>(column name: String) { guard var values = self[name] as? [T?] else { return } var nextValid: T? = nil for idx in values.indices.reversed() { if let val = values[idx] { nextValid = val } else { values[idx] = nextValid } } self[name] = values } } // 调用示例 dataframe.forwardFill(column: "columnName") dataframe.backwardFill(column: "columnName")
说明:如果你的DataFrame库不支持subscript方式读写列,可以替换为对应库的column(_:)和replaceColumn(_:with:)方法。
内容的提问来源于stack exchange,提问作者Kaymanas
相关产品推荐
相关产品推荐

