【问题标题】:How to reformat time series to fill in missing entries with NaNs?如何重新格式化时间序列以用 NaN 填充缺失的条目?
【发布时间】:2021-11-25 04:29:54
【问题描述】:

我遇到了一个问题,涉及将时间序列从 1 转换为 代表另一个人。时间序列中的每个项目都有 属性“时间”、“id”和“值”(将其视为一种度量 在传感器“id”的“时间”)。我将所有项目存储在一个 带有由属性命名的列的 Pandas 数据框。

“时间”的集合是一小组整数(比如 32), 但是一些“id”缺少“time”s/“value”s。我想要什么 构造是具有以下形式的输出数据框:

id  time0 time1 ... timeN
     val0  val1 ...  valN

其中缺失的“值”由 NaN 表示。

例如,假设输入如下所示:

time  id   value
   0   0      13
   2   0      15
   3   0      20
   2   1      10
   3   1      12

然后,假设可能时间的集合是 0、2 和 3,则 期望的输出是:

  id   time0  time1  time2  time3
   0      13    NaN     15     20
   1      NaN   NaN     10     12

我正在寻找一种 Pythonic 方式来执行此操作,因为有几个 输入中的百万行和大约 1/4 百万组。

【问题讨论】:

标签: python-3.x pandas time-series


【解决方案1】:

您可以使用pivot 转换您的表格。如果需要处理索引/列对的重复值,可以使用更通用的pivot_table

对于您的示例,简单的支点就足够了:

>>> df = df.pivot(index="id", columns="time", values="value")

time     0     2     3
id                    
0     13.0  15.0  20.0
1      NaN  10.0  12.0

要从您的问题中获得准确的结果,您可以重新索引列以填充空值,然后像这样重命名列索引:

# add missing time columns, fill with NaNs
df = df.reindex(range(df.columns.max() + 1), axis=1)

# name them "time#"
df.columns = "time" + df.columns.astype(str)

# remove the column index name "time"
df = df.rename_axis(None, axis=1)

最终df:

    time0  time1  time2  time3
id                            
0    13.0    NaN   15.0   20.0
1     NaN    NaN   10.0   12.0

【讨论】:

    猜你喜欢
    • 2018-03-04
    • 2017-05-12
    • 2013-01-13
    • 2019-02-21
    • 1970-01-01
    • 2021-06-01
    • 2019-03-06
    • 2019-06-09
    • 1970-01-01
    相关资源
    最近更新 更多