我有一个事务处理列表,其中列出了事项、日期和金额。输入数据的人员经常出错,因此必须通过输入具有负金额的新成本来冲销成本以抵销错误。我正尝试通过根据事项编号和工作日期对数据分组,然后比较金额,来标识冲销分录和要冲销的分录。
数据如下所示:
| 物料编号|工作日期|金额|
| - ------|- ------|- ------|
| 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)
这看起来很有效,但是非常慢。我需要检查数百万行数据。有没有更好的方法可以更有效地处理这个问题?
1条答案
按热度按时间axr492tv1#
如果我假设“反转”是指这一行的金额小于前一行的金额,那么Pandas可以用
diff
来实现:输出:
第一行必须是特殊情况的,因为没有要比较的内容。