比较季度数据: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。我将非常感谢您为我提供的任何意见。非常感谢您的时间和精力。

【问题讨论】:

也许您可以将appendpd.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 group 日期到季度和总销售额列

pandas 日期数据处理大全,按照年、季度、月、周、日筛选数据

Pandas 按季度转换为每日,同时牢记不同的代码

pandas通过DatetimeProperties对象获取日期对象是否是所在季度的第一天(is quarter start)筛选dataframe数据中日期对象是所在季度第一天的数据行

pandas通过DatetimeProperties对象获取日期对象是否是所在季度的最后一天(is quarter end)筛选dataframe数据中日期对象是所在季度最后一天的数据行