【问题标题】:Complex mask for dataframe数据框的复杂掩码
【发布时间】:2022-01-24 17:13:51
【问题描述】:

我有一个数据框,在一列中有一个时间序列。数据看起来像这个图表

我想创建一个掩码,每次数据等于或低于 -0.20 时为 TRUE。它也应该是 TRUE before 达到 -0.20 而为负。 达到 -0.20 而为负时也应该为真。 这个版本的图表

是我手动尝试显示(红色)掩码为 TRUE 的值。我开始创建掩码,但我只能在数据小于 -0.20 mask = (df['data'] < -0.2) 时使其等于 TRUE。我不能做得更好,有人知道如何实现我的目标吗?

【问题讨论】:

  • 2021年以后排除部分的逻辑是什么?
  • 能否提供数据样本?
  • 请勿张贴代码图片、代码链接、数据、错误消息等 - 将文本复制或输入到问题中。
  • @itprorh66 这实际上是图像合适的罕见情况之一。这显示了数据的形状,并相对较好地说明了如何选择数据。然而,作为文本的附加数据样本会很有用。

标签: python pandas conditional-statements mask


【解决方案1】:

一种方法是对完全低于零的段进行分组,然后为每个组验证是否有任何低于-0.2 的值。

请参阅下面的完整可重现示例脚本:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd


np.random.seed(167)

df = pd.DataFrame(
    {"y": np.cumsum([np.random.uniform(-0.01, 0.01) for _ in range(10 ** 5)])}
)
plt.plot(df)

gt_zero = df["y"] < 0
regions = (gt_zero != gt_zero.shift()).cumsum()

# here's your interesting DataFrame with the specified mask
df_interesting = df.groupby(regions).filter(lambda s: s.min() < -0.2)

# plot individual regions
for i, grp in df.groupby(regions):
    if grp["y"].min() < -0.2:
        plt.plot(grp, color="tab:red", linewidth=5, alpha=0.6)

plt.axhline(0, linestyle="--", color="tab:gray")
plt.axhline(-0.2, linestyle="--", color="tab:gray")
plt.show()

【讨论】:

    【解决方案2】:

    想法

    按相同符号的连续值分组,然后检查该组的最小值是否小于定义的阈值。

    实施

    首先,我们要将负值与正值分开。

    negative_mask = (df['data']&lt;0)

    然后我们可以为每个连续的正数或负数系列创建类(按整数排序)。每次数据更改符号时,类都会增加一。

    consecutives = negative_mask.diff().ne(0).cumsum()

    然后我们只选择连续元素组的最小值小于 0.2 的数据。

    df.groupby(consecutives).filter(lambda df : df[0].min() &lt; -0.2)

    随机数据示例

    我们可以用随机数据试试我们的例子:

    import numpy as np
    import pandas as pd
    
    np.random.seed(42)
    data = np.random.randint(-300, 300, size=1000)/1000
    df = pd.DataFrame(data, columns=["data"])
    

    输出

        data
    2   -0.030
    3   -0.194
    4   -0.229
    5   -0.280
    6   -0.179
    ... ...
    991 -0.293
    995 -0.247
    996 -0.062
    997 -0.072
    999 -0.250
    
    363 rows × 1 columns
    

    【讨论】:

      猜你喜欢
      • 2017-05-11
      • 2013-07-07
      • 2022-08-19
      • 1970-01-01
      • 1970-01-01
      • 2017-11-10
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      相关资源
      最近更新 更多