我有一个庞大的数据文件,其中列出了我们财务系统中的费用条目。(特定任务的唯一标识符)、date
和amount
。经常会出现错误,并且通过在同一天输入同一事项的抵销成本来“取消”费用。使问题复杂化的是,有时候,其中一个已取消的条目被重新输入。这导致一个事务处理有3行(原始、取消和重新输入)。我正在尝试标记哪些行正在取消其他行以及哪些行已被取消。
在下面的代码中,我编写了一个简单的函数,它遍历 Dataframe 的每一行,并将给定事件和日期的金额与其他金额进行比较,如果有其他金额抵消了正在检查的金额,它将标记该事件。
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],
[2,'1/5/2022', 5]
]
df = pd.DataFrame(data, columns=['matter','date','amount'])
def rev_check(matter, date, WorkAmt, df):
funcDF = df.loc[(df['matter'] == matter) & (df['date'] == date)]
listCheck = funcDF['amount'].tolist()
if WorkAmt*-1 in listCheck:
return 'yes'
df['reversal'] = df.apply(lambda row: rev_check(row.matter, row.date, row.amount, df), axis=1)
print(df)
产生以下输出:
matter date amount reversal
0 1 1/2/2022 10 yes
1 1 1/2/2022 15 None
2 1 1/2/2022 -10 yes
3 2 1/4/2022 12 None
4 2 1/5/2022 5 yes
5 2 1/5/2022 -5 yes
6 2 1/5/2022 5 yes
我被卡住的地方在第6行。该行不应该被标记,因为第4行的条目已经被第5行的条目颠倒了。
我很想知道如何更好地处理这一问题,这样我就不会标记这些重新输入的金额。
2条答案
按热度按时间2w3rbyxf1#
我承认我在理解@mozway的解决方案时遇到了一些麻烦。这里有一个我觉得更容易理解的替代方案。
df现在是...
6l7fqoea2#
以下是一种通过重新塑造 Dataframe 的方法:
输出:
中级
df2
:变体
逻辑相同,但使用双
groupby
: