【问题标题】:How to improve this csv dataframe comparator code?如何改进这个 csv 数据帧比较器代码?
【发布时间】:2020-06-10 16:26:06
【问题描述】:

我正在尝试生成一个 csv。存储两个 .csv 之间的错误百分比。这 。 csv' 具有相同的列数和行数,但由不同的提供者计算。我想检查每个单元格之间的变化(百分比),并将其存储为 . .csv。 以下脚本目前正在运行,但耗时太长:

import pandas as pd

try_1 = pd.read_csv('try.csv', encoding="ISO-8859-1")
test_1 = pd.read_csv('test.csv', encoding="ISO-8859-1")
try_1_df = pd.DataFrame(try_1)
test_1_df = pd.DataFrame(test_1)

results = try_1_df.copy()
percentage = try_1_df.copy()

for col in try_1_df.columns:
    for i in range(try_1_df.shape[0]):
        if i > 0 and col != 'date':
            try:
                results.loc[i, col] = float(try_1_df.loc[i, col])-float(try_1_df.loc[i, col])
                if float(try_1_df.loc[i, col]) != 0:
                    percentage.loc[i, col] = (float(results.loc[i, col]) / float(try_1_df.loc[i, col])) * 100
                else: percentage.loc[i, col] = 'ok'
            except KeyError:
                print(col)

percentage.to_csv('percentage_test.csv')

我认为它可以更容易地完成,有人知道如何简化它吗?

.csv' 看起来像:

【问题讨论】:

    标签: python pandas dataframe csv compare


    【解决方案1】:

    df_a

                 client1   client2   client3   client4
    date                                              
    2020-02-26  0.880479  0.635249  0.862602  0.946269
    2021-02-26  0.652312  0.481930  0.875188  0.497397
    2022-02-26  0.920294  0.843312  0.986989  0.030338
    2023-02-26  0.189162  0.881262  0.610923  0.289938
    

    df_b

                 client1   client2   client3   client4
    date                                              
    2020-02-26  0.912638  0.622160  0.306025  0.177105
    2021-02-26  0.557815  0.007662  0.249375  0.382226
    2022-02-26  0.359068  0.286853  0.949497  0.099637
    2023-02-26  0.592457  0.215549  0.351929  0.356738
    

    每个对应单元格之间的绝对百分比差异

    df = abs(df_a.divide(df_b) - 1)
    

    df

                 client1    client2   client3   client4
    date                                               
    2020-02-26  0.035237   0.021038  1.818733  4.342989
    2021-02-26  0.169407  61.899576  2.509519  0.301318
    2022-02-26  1.563008   1.939873  0.039487  0.695515
    2023-02-26  0.680716   3.088451  0.735926  0.187252
    

    客户端或整个数据集之间的 IMO 差异或标准偏差甚至可以更好地表示数据提供者之间的“差异”。

    【讨论】:

      【解决方案2】:

      如果我理解正确的话,你可以做一个subdiv

      >>> df1 = pd.DataFrame(np.random.rand(5, 3)).floordiv(.1)
      >>> df2 = pd.DataFrame(np.random.rand(5, 3)).floordiv(.1)
      >>> df1
           0    1    2
      0  2.0  6.0  6.0
      1  0.0  9.0  6.0
      2  0.0  9.0  0.0
      3  3.0  8.0  2.0
      4  2.0  2.0  5.0
      >>> df2
           0    1    2
      0  2.0  3.0  4.0
      1  8.0  8.0  8.0
      2  3.0  9.0  1.0
      3  9.0  8.0  3.0
      4  1.0  3.0  4.0
      >>> diff = df1.sub(df2)
      >>> pd.DataFrame(np.where(diff.ne(0), df1.div(df2).mul(100), 'ok'))
                         0                  1                  2
      0                 ok              200.0              150.0
      1                0.0              112.5               75.0
      2                0.0                 ok                0.0
      3  33.33333333333333                 ok  66.66666666666666
      4              200.0  66.66666666666666              125.0
      

      如果您需要忽略第一行,只需执行diff = df1.loc[1:].sub(df2.loc[1:])

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-09-29
        • 2019-02-05
        • 1970-01-01
        • 2020-12-12
        • 1970-01-01
        • 2012-09-16
        • 2021-12-14
        • 2019-07-21
        相关资源
        最近更新 更多