【问题标题】:Picking only the first value equals 1 in time period仅选取第一个值等于 1 在时间段内
【发布时间】:2022-01-22 06:59:39
【问题描述】:

我的 df 索引的日期和值为 0 或 1。我需要在几个时间段内从该数据帧中过滤每个前 1 例如:

date            val  ind
2019-08-12        0  0
2019-08-13        1  0
2019-08-14        1  0
2019-08-15        0  1
2019-08-16        1  0
2019-08-19        1  0
2019-08-20        0  0
2019-08-21        1  0
2019-08-22        1  1
2019-08-23        1  0
2019-08-26        0  0
2019-08-27        1  0
2019-08-28        1  0
2019-08-29        0  1
2019-08-30        0  0

df['ind'] 中的每个 1 表示时间段的开始。 现在我有兴趣获得每个时间段的前 1 个:

2019-08-16        1  0
2019-08-22        1  1

【问题讨论】:

  • 我们如何知道月经从哪里开始?
  • 什么才算经期?在你的例子中,第二个应该在 2020-06-03 而不是 2020-06-04,除非我错过了什么?
  • 我只演示了我的 df 的一部分。我还有值为 0 或 1 的列,其中 1 表示周期的开始

标签: python dataframe time-series analytics


【解决方案1】:

您可以尝试计算 1 的数量并在达到 0 时重新启动并保存下一个 1 的索引

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
【解决方案2】:

如果我理解正确,你想得到每组的第一个“1”。

使用如下数据框查看:

       dates  val
0 2019-11-29    0
1 2019-12-02    0
2 2019-12-03    1
3 2019-12-04    1
4 2019-12-05    1
5 2020-06-01    0
6 2020-06-02    0
7 2020-06-03    1
8 2020-06-04    1
9 2020-06-05    1


mask = df["val"].ne(df["val"].shift(1)) & df["val"].eq(1)
df.loc[mask]

得到你:

       dates  val
2 2019-12-03    1
7 2020-06-03    1

我们通过向前移动数据框并检查差异来实现这一点。这意味着当前行与当前行不同的任何行都将被匹配:1 是值而 0 是前一个值或 0 是值而 1 是前一个值的情况。

然后,我们添加另一个条件,即当前行必须等于 1,这会得到每行第一次出现 1 时前面是 0。

【讨论】:

  • 我只需要在时间段内选择前 1 个。期间可能包含几组,但我只需要找到第一组
  • @ДаниилАлтухов 您能否更详细地解释您的期望?我的回答有什么问题?
  • 据我了解,您的代码有助于在每组中找到第一个值。正如我已经写过的,我有另一列 (df['ind']),其值为 0 或 1。一个表示时间段的开始。我需要在我的 df 的每个时间段中找到第一个 1。对不起我的英语不好)
  • @ДаниилАлтухов 但是您没有提供使用值和df["ind"] 的示例,如果我们没有所有信息,我们将无法为您提供帮助
  • 我已经更新了信息,我是stackoverflow的新手,很抱歉
猜你喜欢
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 2016-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多