将numpy数组计算结果映射回pandas时间序列的最佳方法
实现方法
核心是保留过滤空值后的索引信息,保证numpy运算输出的行顺序和过滤后的行顺序一致,再按索引赋值回原DataFrame即可。
完整代码示例
from datetime import datetime import pandas as pd import numpy as np # 步骤1:构造原始时间序列DataFrame dates = [datetime(2011, 1, 2), datetime(2011, 1, 5), datetime(2011, 1, 7), datetime(2011, 1, 8), datetime(2011, 1, 10), datetime(2011, 1, 12)] ts = pd.DataFrame({"a":np.random.randn(6),"b":np.random.randn(6)}, index=dates) ts.iloc[2,0] = np.nan ts.iloc[3,1] = np.nan # 步骤2:过滤空值,同时保留有效行的索引 ts_valid = ts.dropna() # 转numpy数组用于后续运算,支持转任意维度 valid_arr = ts_valid.values # 步骤3:模拟numpy运算得到新列结果,输出长度和有效行数量一致 new_col_c = np.random.randn(valid_arr.shape[0]) # 步骤4:按有效行索引赋值回原始DataFrame ts.loc[ts_valid.index, "c"] = new_col_c
原理解释
- 过滤空值时不要直接调用
.values丢弃索引信息,先将过滤后的DataFrame或它的索引单独存储,这个索引和后续输入numpy运算的数组行是一一对应的 - numpy运算过程中只要没有打乱行顺序,输出的新数组和过滤后的索引顺序完全匹配,用
loc按索引赋值时,原DataFrame中被过滤掉的含空值的行,新列会自动填充为NaN,无需额外处理 - 如果需要生成3维数组用于神经网络输入,也可以先存储有效行的索引,运算完成后用同样的逻辑赋值,不受数组维度影响
注意事项
如果运算过程中存在行shuffle、重排等操作,需额外记录每行对应的原始索引,保证运算输出和原始索引的对应关系正确。
内容的提问来源于stack exchange,提问作者Nabat Farsi
相关产品推荐
相关产品推荐

