我试图创建一个基于单个数据框的报告,该报告显示数据之间的数学差异
单个数据帧:
差异报告
我使用EvaluatePoint列将数据拆分为两个数据帧,然后使用一天结束数据帧创建一个差异报告数据帧
endofday_df = df[df.EvaluatePoint == 'EndOfDay']
intraday_df = df[df.EvaluatePoint == 'IntraDay']
report_df = endofday_df[['EvaluateDate', 'InvoiceNumber', 'InvoiceItem']]
我将所有3个上的索引设置为EvaluateDate、InvoiceNumber、InvoiceItem
endofday_df = endofday_df.set_index(['EvaluateDate', 'InvoiceNumber', 'InvoiceItem'])
intraday_df = endofday_df.set_index(['EvaluateDate', 'InvoiceNumber', 'InvoiceItem'])
report_df = endofday_df.set_index(['EvaluateDate', 'InvoiceNumber', 'InvoiceItem'])
从这里我可以创建附加的差异列
report_df['CostDiff'] = endofday_df['Cost'] - intraday_df['Cost']
除了索引(EvaluateDate、InvoiceNumber、InvoiceItem)仅存在于endofday_df或intraday_df中的情况外,这在大多数情况下都有效
谢谢
编辑
在下面添加完整代码。希望这能让我更清楚地知道我在做什么,以及我想做什么
问题是:
我的想法是在创建endofday_df和intrady_df之后再创建4个数据帧
对于如何做到这一点有点困惑,欢迎提出更好的方法
import pandas as pd
Invoices = {'EvaluatePoint': ['EndOfDay', 'EndOfDay', 'EndOfDay', 'EndOfDay', 'EndOfDay', 'EndOfDay', 'IntraDay', 'IntraDay', 'IntraDay', 'IntraDay', 'IntraDay'],
'EvaluateDate': ['08/06/2021','08/06/2021','08/06/2021','08/06/2021','08/06/2021','08/06/2021','08/06/2021','08/06/2021','08/06/2021','08/06/2021','08/06/2021'],
'InvoiceNumber': [123697, 123697, 123697, 123698, 123699, 123699, 123696, 123697, 123697, 123697, 123698],
'InvoiceItem': [0,1,2,0,0,1,0,0,1,2,0],
'Cost': [-3569,-3745,-3921,-4097,-4273,-4449,-4625,-3569,-3745,-4678,-5329],
'Proceeds': [7000,7569,8138,8707,9276,9845,10414,7000,7569,8138,12690],
'NetAmount': [3431,3824,4217,4610,5003,5396,5789,3431,3824,3460,7361]
}
df = pd.DataFrame(Invoices, columns = ['EvaluatePoint', 'EvaluateDate','InvoiceNumber','InvoiceItem','Cost','Proceeds','NetAmount'])
#print(df)
endofday_df = df[df.EvaluatePoint == 'EndOfDay']
intraday_df = df[df.EvaluatePoint == 'IntraDay']
#print(endofday_df)
#print(intraday_df)
#create base output report from endofday_df
report_df = endofday_df[['EvaluateDate','InvoiceNumber','InvoiceItem']]
#print(report_df)
df_index = ['EvaluateDate','InvoiceNumber','InvoiceItem']
endofday_df = endofday_df.set_index(df_index)
intraday_df = intraday_df.set_index(df_index)
report_df = report_df.set_index(df_index)
DiffColumns = ['Cost','Proceeds','NetAmount']
for col in DiffColumns:
report_df['DiffOf' + str(col)] = endofday_df[col] - intraday_df[col]
print(report_df)
report_df.to_csv("DiffReport.csv",index=True, header=True)
3个数据帧适合您的情况。这两个具有相同的行:
endofday_common_df
,intraday_common_df
通过分别执行对齐步骤,可以分隔3组行:
获取公共行,只需选择任何带有数字的列,不管是哪一列,这里我选择了“成本”:
那么具有公共行的报告是:
对于给定的数据,它如下所示:
仅限EOD的行是(同样,请选择数字列):
看起来是这样的:
只有当天的行是:
这看起来像:
谢谢你的帮助,在让它完全工作时遇到了问题。通过进一步搜索,我最终使用了intersection()和difference()来分割索引。最终代码如下
我还尝试在reset_index和set_index上使用for循环,但它不会停留在for循环之外,我应该在这里做什么来修复它
关于以下最终代码、清理、更有效的方法等的任何反馈
相关问题 更多 >
编程相关推荐