从 numpy 数组映射回 pandas 时间序列的最佳方法

Posted

技术标签:

【中文标题】从 numpy 数组映射回 pandas 时间序列的最佳方法【英文标题】:best way to map back from numpy array to pandas time series 【发布时间】:2021-12-12 08:26:48 【问题描述】:

我有一个如下的时间序列:

from datetime import datetime
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

所以它发生在许多实例上,我们需要将其转换为 numpy 数组,具有非空值,并执行不同的过程,例如 NN 等...

ts.dropna().values

例如,假设一个新列 c 是从 numpy 数组计算(聚类、NN、...)生成的:

将其添加到原始 df 的最佳方法是什么,使其变为:

换句话说,在这个工作流程中:

1- 从 pandas 数据帧多特征时间序列开始

2- 删除空值

3- 从 2 计算一个新数组(分类、NN、...)

4- 将 3 中创建的数组添加到步骤 1 中的原始数据帧(如何正确执行此操作?)

我知道有些人可能会说我们可以在整个过程中坚持使用 pandas,但假设表格是 3 维的,我们需要将其转换为 numpy 数组。

谢谢!

【问题讨论】:

【参考方案1】:

尝试isna/notna 屏蔽您的数据,然后.loc 重新分配:

valids = ts.notna().all(axis=1)

# equivalent to ts.dropna().values
data = ts[valids].to_numpy()

# do stuff
preds = KMeans().fit_predict(data)
# preds = [0, 0, 0, 1]

# assign prediction back
# ravel in the case your predictions are 2D as shown
ts.loc[valids, 'pred'] = preds.ravel()

【讨论】:

【参考方案2】:
    从数据框中删除 NaN 并将索引分配给变量。 使用此索引创建一个包含 c 的 pandas 数据框 将此新数据框左连接到原始数据框

【讨论】:

以上是关于从 numpy 数组映射回 pandas 时间序列的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

从 pandas 转换为 numpy 后,如果数组包含 nan,则删除“nan”或减少 numpy 数组的长度 [重复]

Pandas:从 2D numpy 数组创建一个数据框,保留它们的顺序

从 pandas 数据帧到多维 numpy 数组以与 tensorflow 兼容

从 Numpy 3d 数组有效地创建 Pandas DataFrame

从 MySQL 将数值数据加载到 python/pandas/numpy 数组中的最快方法

从带有描述的 Numpy nd 数组创建 Pandas DataFrame 的更快方法?