python - 移动所有列的数据帧值以使其单调递增

标签 python pandas dataframe

我有一个多列度量值的数据框,这些列是聚合的。这意味着它们代表的函数是单调递增的函数。现在,由于设备的重置,所有测量值都重置为零,之后聚合恢复。但为了处理数据,我需要放弃重置并移动所有列中的所有值以模拟重置从未发生。

因此,我的情况是这样的:

enter image description here

成为

enter image description here

我想要的是一个函数,它将所有列中的所有值移动到最后测量的最大值。

对于一些示例数据,我创建了以下内容:

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


date_range = pd.date_range(start='2021-01-01', end='2021-01-05', freq='1D')
df1 = pd.DataFrame({'Date': date_range, 'Column 1': range(5), 'Column 2': range(5)})

date_range = pd.date_range(start='2021-01-06', end='2021-01-10', freq='1D')
df2 = pd.DataFrame({'Date': date_range, 'Column 1': range(5), 'Column 2': range(5)})


df = pd.concat([df1,df2])

我想成为的人

date_range = pd.date_range(start='2021-01-01', end='2021-01-10', freq='1D')
df3 = pd.DataFrame({'Date': date_range, 'Column 1': range(10), 'Column 2': range(10)})

如果我知道 df 是由 df1 和 df2 构造的,我知道如何执行此操作

def shift_df(df, df1, df2):

    columns = list(df.columns)
    columns.remove('Date')

    max_values = {}
    for col in columns:
        max_values[col] = df1[col].max()

    min_values = {}
    for col in columns:
        min_values[col] = df2[col].min()

    differences = {}
    for col in columns:
        differences[col] = max_values[col] - min_values[col]+1

    for col in columns:
        df[col] = np.where(df['Date'].isin(df2['Date']),
                            df[col] + differences[col],
                            df[col])

    return df

但是如果我只有 df 的知识,我不知道如何概括它。基本上,我如何改变我的功能

shift_df(df, df1, df2)

shift_df(df)

最佳答案

假设您想要独立处理所有列,这是一个选项:

  • 使用 diff 计算并识别负跳跃
  • 仅保留这些值,反转值,加 1
  • 计算 cumsum
  • 添加到原始系列
def shifter(s):
    m = s.diff()
    return s.add((-m.sub(1)).where(m.lt(0), 0).cumsum())

out = df.set_index('Date').apply(shifter)

输出:

            Column 1  Column 2
Date                          
2021-01-01       0.0       0.0
2021-01-02       1.0       1.0
2021-01-03       2.0       2.0
2021-01-04       3.0       3.0
2021-01-05       4.0       4.0
2021-01-06       5.0       5.0
2021-01-07       6.0       6.0
2021-01-08       7.0       7.0
2021-01-09       8.0       8.0
2021-01-10       9.0       9.0

另一个例子:

df = pd.DataFrame({'Date': [Timestamp('2021-01-01 00:00:00'), Timestamp('2021-01-02 00:00:00'), Timestamp('2021-01-03 00:00:00'), Timestamp('2021-01-04 00:00:00'), Timestamp('2021-01-05 00:00:00'), Timestamp('2021-01-06 00:00:00'), Timestamp('2021-01-07 00:00:00'), Timestamp('2021-01-08 00:00:00'), Timestamp('2021-01-09 00:00:00'), Timestamp('2021-01-10 00:00:00')],
                   'Column 1': [0, 1, 2, 3, 4, 0, 1, 2, 3, 4],
                   'Column 2': [3, 4, 5, 6, 7, 3, 4, 5, 6, 7]}
)

out = df.set_index('Date').apply(shifter)

输出:

            Column 1  Column 2
Date                          
2021-01-01       0.0       3.0
2021-01-02       1.0       4.0
2021-01-03       2.0       5.0
2021-01-04       3.0       6.0
2021-01-05       4.0       7.0
2021-01-06       5.0       8.0
2021-01-07       6.0       9.0
2021-01-08       7.0      10.0
2021-01-09       8.0      11.0
2021-01-10       9.0      12.0

关于python - 移动所有列的数据帧值以使其单调递增,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75567051/

相关文章:

python - 在 tkinter (python3) : unexpected behavior 中将值从子窗口传递到父窗口

pandas - OneHotEncoder 给出 ValueError : Input contains NaN ; even though my DataFrame doesn't contain any NaN as indicated by df. isna()

python - 如何根据连续索引拆分 DataFrame?

python - 是否可以用 str.contain 定义句子中字符的索引?

python - Django : Static content not found

python - 列的最大值和最小值之间的差异

python - 昨天查询 pandas 之前我该怎么做

python - 如何将一列除以另一列,其中一个数据框的列值对应于 Python Pandas 中另一个数据框的列值?

python - 如何将 pandas 数据框列转换为 native python 数据类型?

python - 评估(输入()):input at most expected at most 1 argument