比较季度数据:Python(Pandas) 中的迭代以比较来自作为数据框导入的四个不同 excel 文件的多列
Posted
技术标签:
【中文标题】比较季度数据:Python(Pandas) 中的迭代以比较来自作为数据框导入的四个不同 excel 文件的多列【英文标题】:Comparing quarterly data: Iteration in Python(Pandas) to compare multiple columns from four different excel files imported as dataframe 【发布时间】:2021-08-29 01:33:34 【问题描述】:尊敬的 *** 社区, 我有一个 excel 文件 "big_excel.xlsx",它由四列组成,即 "date_column"、"efficacy"、"组合” 和 “测试组”。基本上,我已将这个 excel 每季度拆分一次“q1..q4”,这样我就可以将每列中的值与我从 4 个不同来源收到的 4 个不同的 excel 进行比较,这些 excel 应该是 100% 相同的.来自发件人的这个 excel 元素已经以这样的方式排序,它应该与每季度拆分的 excel 完全匹配。我的代码非常适合第一季度。为了比较,我使用了“.equals”,因为它可以有 nans。现在我必须对剩余的季度应用相同的代码概念q2..q4。
import pandas as pd
from os.path import expanduser as ospath
import numpy as np
df = pd.read_excel(ospath('big_excel.xlsx'))
df.date_column = pd.to_datetime(df.date_column)
df['quarters'] = df.date_column.dt.quarter
q1 = df[df.quarters == 1]
q2 = df[df.quarters == 2].reset_index(drop=True)
q3 = df[df.quarters == 3].reset_index(drop=True)
q4 = df[df.quarters == 4].reset_index(drop=True)
test_excel_q1 = pd.read_excel(ospath('from_biontech.xlsx'))
test_excel_q2 = pd.read_excel(ospath('from_astrazeneca.xlsx'))
test_excel_q3 = pd.read_excel(ospath('from_sputnik.xlsx'))
test_excel_q4 = pd.read_excel(ospath('from_moderna.xlsx'))
q1['compare_date_column'] = np.where(q1[q1.columns[1]].equals(test_excel_q1[test_excel_q1.columns[1]]), 'True', 'False')
q1['compare_efficacy'] = np.where(q1[q1.columns[2]].equals(test_excel_q1[test_excel_q1.columns[2]]), 'True', 'False')
q1['compare_composition'] = np.where(q1[q1.columns[3]].equals(test_excel_q1[test_excel_q1.columns[3]]), 'True', 'False')
q1['compare_testgroups'] = np.where(q1[q1.columns[4]].equals(test_excel_q1[test_excel_q1.columns[4]]), 'True', 'False')
为此,我显然可以在q1['compare_date_column']
、q1['compare_efficacy']
、q1['compare_composition']
和q1['compare_testgroups']
中更改q1-> q2,q3,q4,然后复制和粘贴。但是,这是一个肮脏的解决方案,如果我将来增加列,我会很困惑。所以,我想知道我的问题是否可以通过迭代来解决。
我的想法:创建一个变量列表var_list = [q1,q2,q3,q4]
,其中对于 var_list 中的每个索引,它采用索引 i 并迭代替换它
q1['compare_date_column'] = np.where(q1[q1.columns[1]].equals(test_excel_q1[test_excel_q1.columns[1]]), 'True', 'False')
q1['compare_efficacy'] = np.where(q1[q1.columns[2]].equals(test_excel_q1[test_excel_q1.columns[2]]), 'True', 'False')
q1['compare_composition'] = np.where(q1[q1.columns[3]].equals(test_excel_q1[test_excel_q1.columns[3]]), 'True', 'False')
q1['compare_testgroups'] = np.where(q1[q1.columns[4]].equals(test_excel_q1[test_excel_q1.columns[4]]), 'True', 'False')
我是否需要为此定义一个函数,如果是,任何人都可以帮助我,因为我还在学习 python。我将非常感谢您为我提供的任何意见。非常感谢您的时间和精力。
【问题讨论】:
也许您可以将append
或pd.concat
组合在一起测试数据帧,然后将生成的测试数据帧与第一个df
进行比较,而不是为每个季度拆分df
感谢您的回复。是的,这也可能是一个解决方案。这只是一个例子。在我真实的公司场景中,我们将测试环境拆分为 4 个不同的实例。每次,来自大 excel 的数据都被分成四等份并输入到每个实例中。然后在每个实例(跳跃隧道、连接和实例)中使用脚本一一验证数据。很难从每个环境中提取此 excel 以进行连接或附加。对不起,如果我混淆了你。无论如何,我还想学习如何在我提供的给定场景中进行迭代。
【参考方案1】:
一种方法可能是定义一个函数,该函数采用四分之一数据帧和该季度的相应测试数据帧,并返回带有比较列的原始数据帧。 比如:
# you can also use this function to compare just one quarter
def compare_quarter(df_q:pd.DataFrame, df_test_q:pd.DataFrame):
# this do exactly the same as your 4 comparing code lines
df_q[[
'compare_date_column',
'compare_efficacy',
'compare_composition',
'compare_testgroups'
]] = \
[np.where(df_q.iloc[:, i].equals(df_test_q.iloc[:, i]), 'True', 'False') for i in range(1,5)]
return df_q
然后你只需在四分之一上迭代函数:
for q, t in zip([q1, q2, q3, q4], [test_excel_q1, test_excel_q2, test_excel_q3, test_excel_q4]):
q = compare_quarter(q, t)
注意:
我注意到,当您比较每一列时,您是在比较整个季度和测试列。这意味着:如果只有一行不同,则整个 compare_column
(所有行)将是 False
。如果您想逐元素比较,请在如下函数中使用 eq
方法:
def compare_quartals(df_q:pd.DataFrame, df_test_q:pd.DataFrame):
comp_cols = [
'compare_date_column',
'compare_efficacy',
'compare_composition',
'compare_testgroups'
]
for i in range(1,5):
df_q[comp_cols[i-1]] = df_q.iloc[:, i].eq(df_test_q.iloc[:, i])
return df_q
【讨论】:
哇!非常感谢您的回答!对我帮助很大!以上是关于比较季度数据:Python(Pandas) 中的迭代以比较来自作为数据框导入的四个不同 excel 文件的多列的主要内容,如果未能解决你的问题,请参考以下文章
pandas 日期数据处理大全,按照年、季度、月、周、日筛选数据
pandas通过DatetimeProperties对象获取日期对象是否是所在季度的第一天(is quarter start)筛选dataframe数据中日期对象是所在季度第一天的数据行
pandas通过DatetimeProperties对象获取日期对象是否是所在季度的最后一天(is quarter end)筛选dataframe数据中日期对象是所在季度最后一天的数据行