我有一个多列度量值的数据框,这些列是聚合的。这意味着它们代表的函数是单调递增的函数。现在,由于设备的重置,所有测量值都重置为零,之后聚合恢复。但为了处理数据,我需要放弃重置并移动所有列中的所有值以模拟重置从未发生。
因此,我的情况是这样的:
成为
我想要的是一个函数,它将所有列中的所有值移动到最后测量的最大值。
对于一些示例数据,我创建了以下内容:
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)
最佳答案
假设您想要独立处理所有列,这是一个选项:
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/