给定单个值,及时修复:
2010-06-01 : 100
过去和未来(相对于固定日期)发生在该值上的更改列表:
Date Diff
2010-04-01 30
2010-05-01 20
2010-07-01 60
2010-08-01 10
我想要以下结果:
Date Value
2010-04-01 50
2010-05-01 80
2010-06-01 100
2010-07-01 160
2010-08-01 170
基本上,固定日期之后的差异将被累计求和,并且累计扣除固定日期之前的差异。
我目前的解决方案是:
将差异DataFrame过滤为两个:一个包含过去,一个包含将来的值。
取消过去的DF,将其附加到当前的DF,按降序排序,然后执行cumsum。
拿下未来的DF,将其附加到当前的DF,升序排序,并做一个cumsum。
将所有内容附加在一起。
一些入门代码:
pd.DataFrame({'Date': ['2010-04-01', '2010-05-01', '2010-07-01', '2010-08-01'], 'Diff': [30,20,60,10]})
pd.DataFrame({'Date': ['2010-06-01'], 'Value': [100]})
答案 0 :(得分:1)
您可以创建条件并应用它们的功能:
#convert to datetimes
df1.Date = pd.to_datetime(df1.Date)
df2.Date = pd.to_datetime(df2.Date)
#join together
df = (pd.concat([df1, df2.rename(columns={'Value':'Diff'})])
.sort_values('Date')
.reset_index(drop=True))
print (df)
Date Diff
0 2010-04-01 30
1 2010-05-01 20
2 2010-06-01 100
3 2010-07-01 60
4 2010-08-01 10
m1 = df.Date < df2.loc[0, 'Date']
m2 = ~m1
#condition for select only appended value
m3 = m2[[m2.idxmax()]]
print (m3)
2 True
Name: Date, dtype: bool
#multiple by -1 by condition m1
df.loc[m1, 'Diff'] *= -1
#chained m1 and m3 for inverse cumulative sum
df.loc[m1 | m3, 'Diff'] = df.loc[m1 | m3, 'Diff'].iloc[::-1].cumsum()
#classic cumsum
df.loc[m2, 'Diff'] = df.loc[m2, 'Diff'].cumsum()
print (df)
Date Diff
0 2010-04-01 50
1 2010-05-01 80
2 2010-06-01 100
3 2010-07-01 160
4 2010-08-01 170