【问题标题】:DataSet in Panda: Increase Offset if next value is smaller then previous onePanda中的DataSet:如果下一个值小于前一个值,则增加偏移量
【发布时间】:2022-01-22 23:53:45
【问题描述】:

我最初有以下数据集:

value;date
100;2021-01-01
160;2021-02-01
250;2021-02-15
10;2021-03-01
90;2021-04-01
150;2021-04-15
350;2021-06-01
20;2021-07-01
100;2021-08-01
10;2021-08-10

每当“值”值下降时(例如,2021 年 3 月 1 日从 250 下降到 10),我想将旧值保存为偏移量。

当值再次下降时(例如 2021 年 7 月 1 日从 350 到 20),我想将新偏移量添加到旧偏移量 (350 + 250)。

之后我想用这些值添加偏移量,以便在最后得到以下数据集:

value;date;offset;corrected_value
100;2021-01-01;0;100
160;2021-02-01;0;160
250;2021-02-15;0;250
10;2021-03-01;250;260
90;2021-04-01;250;340
150;2021-04-15;250;400
350;2021-06-01;250;600
20;2021-07-01;600;620
100;2021-08-01;600;700
10;2021-08-10;700;710

我目前(糟糕)的方法不起作用:

    df['date'] = pd.to_datetime(df['date'])
    df.index = df['date']
    del df['date']
    df.drop_duplicates(keep='first')

    df['previous'] = df['value'].shift(1)

    def pn(current, previous, offset):
        if not pd.isna(previous):
            if current < previous:
                return previous + offset
        return offset

    df['offset'] = 0
    df['offset'] = df.apply(lambda row: pn(row['value'], row['previous'], row['offset']), axis=1)

非常感谢您的帮助,谢谢!

干杯

【问题讨论】:

    标签: python pandas dataset


    【解决方案1】:

    使用pd.Series.diffpd.Series.shift 在“值”列中查找所需位置。填充 0 并计算 cumsum。将 'offset' 列添加到 'value'

    df['offset'] = df.value[df.value.diff().lt(0).shift(-1, fill_value=False)]
    df['offset'] = df.offset.shift(1).fillna(0).cumsum().astype('int')
    
    df['correct_value'] = df.offset + df.value
    df
    

    输出

       value        date  offset  correct_value
    0    100  2021-01-01       0            100
    1    160  2021-02-01       0            160
    2    250  2021-02-15       0            250
    3     10  2021-03-01     250            260
    4     90  2021-04-01     250            340
    5    150  2021-04-15     250            400
    6    350  2021-06-01     250            600
    7     20  2021-07-01     600            620
    8    100  2021-08-01     600            700
    9     10  2021-08-10     700            710
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-25
      • 1970-01-01
      • 2010-11-07
      • 1970-01-01
      • 1970-01-01
      • 2018-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多