pandas-在计算中使用特定的条件记录来更新列的值

epggiuax  于 2021-09-08  发布在  Java
关注(0)|答案(1)|浏览(351)

我已经为此尝试了几种方法,但目前无法找到最佳解决方案。。。我对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

你有什么建议吗?“何处”是一个好方法吗?
你会怎么做?谢谢你的帮助

goqiplq2

goqiplq21#

我认为 Dataframe 的增量更新的需要使得标准pandas方法不是这里的最佳选择(增量更新指的是帧某个部分的更改会影响其他部分的结果。)
据我所知,这可能是一种实现您所需的方式:

df.Date = pd.to_datetime(df.Date)  # Just in case

dfs = []
prev = 0
for _, group in df.groupby(df.Date.dt.strftime('%Y-%m')):
    if prev:
        group.ABC = group.XYZ * prev
    group['PreviousMonthABCValue'] = prev
    prev = group.ABC.iloc[-1]
    dfs.append(group)
df = pd.concat(dfs)

我假设 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)

但我不喜欢使用全球变量 `prev` 在里面 `update` .

相关问题