【问题标题】:Label row when value changes pandas值更改时的标签行 pandas
【发布时间】:2022-01-24 18:45:53
【问题描述】:

我需要解决以下问题。我拥有的是时间戳和值。该值可以改变为正、负或保持稳定。一旦它从一行到另一行发生积极变化或保持稳定,我想在新列中添加一个标签。如果该值继续增加,则应将相同的标签添加到该行。一旦值发生负变化,应输入零作为标签。谁能帮帮我?

输入数据

df_raw = pd.DataFrame(
    {
        "timestamp": [
            "2017-06-16 05:19:18.993",
            "2017-06-16 05:19:28.993",
            "2017-06-16 05:19:38.993",
            "2017-06-16 05:19:48.993",
            "2017-06-16 05:19:58.993",
            "2017-06-16 05:25:08.993",
            "2017-06-16 05:25:18.993",
            "2017-06-16 07:44:28.993",
            "2017-06-16 07:45:38.993",
        ],
        "signalvalue": [0.0, 12.0, 22.0, 13.0, 0.0, 30.0, 0.0, 3.0, 6.0],
    }
)

    timestamp                signalvalue
0   2017-06-16 05:19:18.993  0.0
1   2017-06-16 05:19:28.993  12.0
2   2017-06-16 05:19:38.993  22.0
3   2017-06-16 05:19:48.993  13.0
4   2017-06-16 05:19:58.993  0.0
5   2017-06-16 05:25:08.993  30.0
6   2017-06-16 05:25:18.993  0.0
7   2017-06-16 07:44:28.993  3.0
8   2017-06-16 07:45:38.993  6.0

期望的输出

    timestamp                signalvalue    label
0   2017-06-16 05:19:18.993  0.0            0
1   2017-06-16 05:19:28.993  12.0           1
2   2017-06-16 05:19:38.993  22.0           1
3   2017-06-16 05:19:48.993  13.0           0
4   2017-06-16 05:19:58.993  0.0            0
5   2017-06-16 05:25:08.993  30.0           2
6   2017-06-16 05:25:18.993  0.0            0
7   2017-06-16 07:44:28.993  3.0            3
8   2017-06-16 07:45:38.993  6.0            3

【问题讨论】:

  • 澄清:label 值应该在每次看到新事件时增加?你尝试了什么,你的尝试出了什么问题?我们要求问题包括 minimal reproducible example 显示您迄今为止尝试过的代码

标签: python pandas label


【解决方案1】:

如果大于零,您可以根据连续值的diff 计算掩码。然后只保留每个拉伸的第一项来计算cumsum

m1= df_raw['signalvalue'].diff().gt(0)

df_raw['label'] = (m1&m1.ne(m1.shift())).cumsum()*m1.astype(int)

输出:

                 timestamp  signalvalue  label
0  2017-06-16 05:19:18.993          0.0      0
1  2017-06-16 05:19:28.993         12.0      1
2  2017-06-16 05:19:38.993         22.0      1
3  2017-06-16 05:19:48.993         13.0      0
4  2017-06-16 05:19:58.993          0.0      0
5  2017-06-16 05:25:08.993         30.0      2
6  2017-06-16 05:25:18.993          0.0      0
7  2017-06-16 07:44:28.993          3.0      3
8  2017-06-16 07:45:38.993          6.0      3

【讨论】:

  • 到目前为止一切正常!但我自己认识到了一个错误。如果值之间的差异保持稳定,则标签不应为零。因此,只有当差异为负时,标签才应为 0。否则它应该像描述的那样增加。如何将其添加到您的解决方案中?谢谢!
  • 我想用ge(0)(大于或等于)替换gt(0)(大于)
【解决方案2】:

您可以使用以下功能:

def increment_method_1(df,name):
    Results=[]
    last_result=0
    prev_val=0
    for val in df[name].values:
        if val==0 or (val>0 and prev_val>=val):
            Results.append(0)
        elif prev_val<val and prev_val!=0:
            Results.append(last_result)
        elif prev_val<val and prev_val==0:
            last_result+=1
            Results.append(last_result)
        else:
            print(prev_val,val,last_result)
            print("Unexpected condition")
        prev_val=val
    return Results

【讨论】:

    【解决方案3】:

    我假设您期望的输出类似于以下代码 sn-p。

    import pandas as pd
    import numpy as np
    
    df_raw = pd.DataFrame(
        {
            "timestamp": [
                "2017-06-16 05:19:18.993",
                "2017-06-16 05:19:28.993",
                "2017-06-16 05:19:38.993",
                "2017-06-16 05:19:48.993",
                "2017-06-16 05:19:58.993",
                "2017-06-16 05:25:08.993",
                "2017-06-16 05:25:18.993",
                "2017-06-16 07:44:28.993",
                "2017-06-16 07:45:38.993",
            ],
            "signalvalue": [0.0, 12.0, 22.0, 13.0, 0.0, 30.0, 0.0, 3.0, 6.0],
        }
    )
    
    modified = np.zeros((len(df_raw),)).astype(int)
    positive = 0 
    
    for i in range(1, len(df_raw)):
        if df_raw["signalvalue"][i] > df_raw["signalvalue"][i - 1]:
            if modified[i - 1] == 0:
                positive += 1
                modified[i] = positive
            else:
                modified[i] = positive
    
        
    df_raw['label'] = modified
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2020-12-14
      相关资源
      最近更新 更多