我已经为此尝试了几种方法,但目前无法找到最佳解决方案。。。我对Pandas还不是很熟悉,所以如果需要,请随时提出任何新的解决方案。
如何获取上个月的最后一条记录并使用“”列的值?
我想:
currentrow['']=上月的最后一天['']*currentrow['xyz']
我尝试使用以下逻辑:
df['MonthChanged'] = df['Month'] - df['Month'].shift()
df['PreviousMonthABCValue'] = pd.np.where(df['MonthChanged'] > 0, df['ABC'].shift(), 0)
df['PreviousMonthABCValue'] = df['PreviousMonthABCValue'].replace(to_replace=0, method='ffill')
df['ABC'] = pd.np.where(df['AsOfMonth'] == 1, df['ABC'], df['PreviousMonthABCValue'] * df['XYZ'])
这种方法的问题是my where中的previousmonthvalue没有更新(这很明显,因为只有得到更新)。
因此,如果我有以下df:
Date ABC XYZ
2021-01-01 440 5
2021-01-02 105 10
...
2021-01-31 100 4
2021-02-01 80 12
2021-02-02 50 40
...
2021-02-28 10 44
2021-03-01 3 20
预期产出为:
Date ABC XYZ PreviousMonthABCValue
2021-01-01 440 5 0 # <- ABC value did not change because PreviousMonthABCValue is 0
2021-01-02 105 10 0
...
2021-01-31 100 4 0
2021-02-01 1200 12 100 # <- ABC Value changed to be: 100 * 12
2021-02-02 4000 40 100 # <- ABC Value changed to be: 100 * 40
...
2021-02-28 4400 44 100 # <- ABC Value changed to be: 100 * 44
2021-03-01 88000 20 4400 # <- ABC Value changed to be: 4400 * 20
你有什么建议吗?“何处”是一个好方法吗?
你会怎么做?谢谢你的帮助
1条答案
按热度按时间goqiplq21#
我认为 Dataframe 的增量更新的需要使得标准pandas方法不是这里的最佳选择(增量更新指的是帧某个部分的更改会影响其他部分的结果。)
据我所知,这可能是一种实现您所需的方式:
我假设
Date
列按升序排列(似乎是这样)。对于
df =
```Date ABC XYZ
0 2021-01-01 440 5
1 2021-01-02 105 10
2 2021-01-31 100 4
3 2021-02-01 80 12
4 2021-02-02 50 40
5 2021-02-28 10 44
6 2021-03-01 3 20
Date ABC XYZ PreviousMonthABCValue
0 2021-01-01 440 5 0
1 2021-01-02 105 10 0
2 2021-01-31 100 4 0
3 2021-02-01 1200 12 100
4 2021-02-02 4000 40 100
5 2021-02-28 4400 44 100
6 2021-03-01 88000 20 4400
df.Date = pd.to_datetime(df.Date) # Just in case
def update(sdf):
global prev
if prev:
sdf.ABC = sdf.XYZ * prev
sdf['PreviousMonthABCValue'] = prev
prev = sdf.ABC.iloc[-1]
return sdf
prev = 0
df = df.groupby(df.Date.dt.strftime('%Y-%m')).apply(update)