【问题标题】:python compare CSV and find differencepython比较CSV并找出差异
【发布时间】:2018-05-10 18:27:07
【问题描述】:

我有两个 CSV:

CSV1

id, count
1, 5
2, 10
100, 1

CSV2

id, count
100, 5
1, 10
2, 1

我需要将 CSV 与 id 进行比较,并获取两者的计数并找出差异。我的预期结果是:

id, Diff
1, -5
100, -4
2, 9

现在我使用嵌套循环:

with open('csv1.csv', 'r') as t1, open('csv2.csv', 'r') as t2:
fileone = csv.DictReader(t1)
filetwo = csv.DictReader(t2)
csv1 = list(fileone)
csv2 = list(filetwo)
for data in csv1:
    for datum in csv2:
        if data['id'] == datum['id']:
            diff = int(data['count']) - int(datum['count'])

            if diff > 0:
                print(diff)
                item = [[
                    str(data['id']),
                   str(data['count']),
                  str(datum['count']),
                  str(diff)]]
                writer.writerows(item)

但是由于上面的代码在循环中做了一个循环,所以如果我有大文件 O(n^2),它需要很长时间。无论如何我可以很容易地在python中进行比较。

【问题讨论】:

  • 听起来像是 pandas 恕我直言的工作
  • 你看过pandas吗?一个简单的join 加上一些算术会让这个速度很快
  • 如果没有 pandas,您可以使用字典来匹配 id。这会将复杂度降低到 O(n)

标签: python csv comparison


【解决方案1】:

这个O(n**2)代码:

fileone = csv.DictReader(t1)
filetwo = csv.DictReader(t2)
csv1 = list(fileone)
csv2 = list(filetwo)
for data in csv1:
    for datum in csv2:
        if data['id'] == datum['id']:
           diff = int(data['count']) - int(datum['count'])
           ...

可以通过使用 id 字段作为键创建 2 个字典来替换,然后执行键的交集。然后在相交的键上循环:

csv1 = {data["id"]:data for data in fileone}
csv2 = {data["id"]:data for data in filetwo}
keys = set(csv1) & csv2
for k in keys:
    data = csv1[k]
    datum = csv2[k]
    diff = int(data['count']) - int(datum['count'])
    ...

现在您的复杂度约为 O(n)(字典查找平均为 O(1)

【讨论】:

    【解决方案2】:

    试试pandas:

    import pandas as pd
    df1 = pd.read_csv('csv1.csv', index_col='id')
    df2 = pd.read_csv('csv2.csv', index_col='id')
    df_diff = df1-df2
    print(df1)
    print(df2)
    print(df_diff)
    

    输出:

          count
    id         
    1         5
    2        10
    100       1
          count
    id         
    100       5
    1        10
    2         1
          count
    id         
    1        -5
    2         9
    100      -4
    

    Pandas 将为您处理索引对齐(在您的情况下为 id),并将使用编译后的 numpy 算法来更快加快计算速度。

    【讨论】:

      【解决方案3】:

      如果你想试试 Pandas。

      import pandas as pd
      df1 = pd.read_csv('csv1.csv',names=['id','count_1'])
      df2=pd.read_csv('csv2.csv',names=['id','count_2'])
      
      df_merged=df1.merge(df2,on='id')
      df_merged['diff'] = df1.count_1 - df2.count_2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-08
        • 2017-12-11
        • 1970-01-01
        相关资源
        最近更新 更多