pandas 检查偏移值的 Dataframe

zlhcx6iw  于 2022-12-16  发布在  其他
关注(0)|答案(1)|浏览(154)

我有一个事务处理列表,其中列出了事项、日期和金额。输入数据的人员经常出错,因此必须通过输入具有负金额的新成本来冲销成本以抵销错误。我正尝试通过根据事项编号和工作日期对数据分组,然后比较金额,来标识冲销分录和要冲销的分录。
数据如下所示:
| 物料编号|工作日期|金额|
| - ------|- ------|- ------|
| 1个|2022年2月1日|十个|
| 一个|2022年2月1日|十五|
| 1个|2022年2月1日|-10|
| 第二章|2022年4月1日|十五|
| 第二章|2022年5月1日|-5个|
| 第二章|2022年5月1日|五个|
所以我的输出表看起来像这样:|物料编号|工作日期|金额|逆转?||- ———————-|- ——————-|- ————-|- ———————-||1|1/02/2022|10| 是的||1|1/02/2022|15|没有||1|1/02/2022|-10|是的||2|1/04/2022|15|没有||2|1/05/2022|-5|是的||2|1/05/2022|5|是的|
现在,我使用下面的代码来检查每一行:

import pandas as pd 

data = [
        [1,'1/2/2022',10],
        [1,'1/2/2022',15],
        [1,'1/2/2022',-10],
        [2,'1/4/2022',12],
        [2,'1/5/2022',-5],
        [2,'1/5/2022',5]
    ]
df = pd.DataFrame(data, columns=['MatterNum','WorkDate','Amount'])

def rev_check(MatterNum, workDate, WorkAmt, df):
    funcDF = df.loc[(df['MatterNum'] == MatterNum) & (df['WorkDate'] == workDate)] 

    listCheck = funcDF['Amount'].tolist()
    if WorkAmt*-1 in listCheck:
        return 'yes'

df['reversal?'] = df.apply(lambda row: rev_check(row.MatterNum, row.WorkDate, row.Amount, df), axis=1)

这看起来很有效,但是非常慢。我需要检查数百万行数据。有没有更好的方法可以更有效地处理这个问题?

axr492tv

axr492tv1#

如果我假设“反转”是指这一行的金额小于前一行的金额,那么Pandas可以用diff来实现:

import pandas as pd

data = [
        [1,'1/2/2022',10],
        [1,'1/2/2022',15],
        [1,'1/2/2022',-10],
        [1,'1/2/2022',12]
    ]

df = pd.DataFrame(data, columns=['MatterNum','WorkDate','Amount'])
print(df)
df['Reversal'] = df['Amount'].diff()<0
print(df)

输出:

MatterNum  WorkDate  Amount
0          1  1/2/2022      10
1          1  1/2/2022      15
2          1  1/2/2022     -10
3          1  1/2/2022      12
   MatterNum  WorkDate  Amount  Reversal
0          1  1/2/2022      10     False
1          1  1/2/2022      15     False
2          1  1/2/2022     -10      True
3          1  1/2/2022      12     False

第一行必须是特殊情况的,因为没有要比较的内容。

相关问题