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

因此,我认为这一状况:

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])

which I want 变成

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来计算并识别负 skip
  • 只保留这些值,求反值,加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-3.x相关问答推荐

While循环不停止地等待,直到时间.睡眠结束

替换 .txt 文件中的项目列表

如何创建与导航抽屉一起使用的导航栏

仅当从 USB 摄像头接收到新图像时才处理图像

Python 列表求和所有出现的保留顺序

位对的距离

Python多进程:运行一个类的多个实例,将所有子进程保留在内存中

运行 pip install -r requirements.txt 时出错

Python:获取未绑定的类方法

为什么 Django South 1.0 使用 iteritems()?

Anaconda 中的依赖项和包冲突?

IronPython 3 支持?

Asyncio RuntimeError:事件循环已关闭

为 True 相交两个布尔数组

使用 asyncio 的多个循环

python - Pandas - Dataframe.set_index - 如何保留旧的索引列

带有 Emacs 的 Python 3

新项目:Python 2 还是 Python 3?

为什么异步库比这个 I/O 绑定操作的线程慢?

Pylint 中的模块PyQt5.QtWidgets错误中没有名称QApplication