【问题标题】:Create subset of pandas dataframe based on continuity根据连续性创建熊猫数据框的子集
【发布时间】:2021-11-25 04:10:06
【问题描述】:

我有一个 Pandas 数据框,其时间序列索引约为 300 万行。这个数据框有几列,我想根据列中的值,根据时间序列的连续性,从这个数据框中创建子集。数据不会在所有列中继续。通过这个,我的意思是在 n 列中的任何一个中有 NaN 行,在这种情况下,这意味着它不是一个连续的时间序列。我想从原始数据框 (A) 中构建子集 (B,C),这些子集应该是一个连续的时间序列,并且在任一列中都没有 NaN 值。

例子:

数据帧 A

predicted_at x1 x2
2021-08-21 11:00:00 UTC 1002 202
2021-08-21 12:00:00 UTC 123 432
2021-08-21 13:00:00 UTC 1253 542
2021-08-21 14:00:00 UTC 231 NaN
2021-08-21 15:00:00 UTC 23 232
2021-08-21 16:00:00 UTC 321 123
2021-08-21 17:00:00 UTC 125 124

子集 B:

predicted_at x1 x2
2021-08-21 11:00:00 UTC 1002 202
2021-08-21 12:00:00 UTC 123 432
2021-08-21 13:00:00 UTC 1253 542

子集 C:

predicted_at x1 x2
2021-08-21 15:00:00 UTC 23 232
2021-08-21 16:00:00 UTC 321 123
2021-08-21 17:00:00 UTC 125 124

如何进行此操作?

【问题讨论】:

  • 为什么您的示例中的子集 B 和 C 相同?
  • @RJAdriaansen 已编辑
  • 你想用这个子集做什么?输出应该是什么?

标签: python pandas dataframe time-series


【解决方案1】:

使用cumsum设置连续组:

df['subset'] = df.isna().any(axis=1).cumsum().loc[df.notna().all(axis=1)]
print(df)

# Output:
              predicted_at    x1     x2  subset
0  2021-08-21 11:00:00 UTC  1002  202.0     0.0
1  2021-08-21 12:00:00 UTC   123  432.0     0.0
2  2021-08-21 13:00:00 UTC  1253  542.0     0.0
3  2021-08-21 14:00:00 UTC   231    NaN     NaN
4  2021-08-21 15:00:00 UTC    23  232.0     1.0
5  2021-08-21 16:00:00 UTC   321  123.0     1.0
6  2021-08-21 17:00:00 UTC   125  124.0     1.0

现在你可以做groupby 或你想要的。

【讨论】:

    猜你喜欢
    • 2021-06-02
    • 2021-09-11
    • 2022-01-04
    • 1970-01-01
    • 2016-03-28
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    相关资源
    最近更新 更多