【问题标题】:Compare two csv files with python pandas将两个 csv 文件与 python pandas 进行比较
【发布时间】:2017-07-14 01:52:06
【问题描述】:

我有两个 csv 文件都包含两列。

第一个有产品ID,第二个有序列号。

我需要查找第一个 csv 中的所有序列号,并在第二个 csv 中找到匹配项。结果报告将在单独的列中包含匹配的序列号,以及来自每个 csv 的相应产品 ID 我确实修改了下面的代码,没有运气。

你会如何处理这个问题?

import pandas as pd
    A=set(pd.read_csv("c1.csv", index_col=False, header=None)[0]) #reads the csv, takes only the first column and creates a set out of it.
    B=set(pd.read_csv("c2.csv", index_col=False, header=None)[0]) #same here
    print(A-B) #set A - set B gives back everything thats only in A.
    print(B-A) # same here, other way around.

【问题讨论】:

  • 您可以添加一些示例数据和所需的输出吗?因为有点不清楚到底需要什么。

标签: python python-3.x csv pandas


【解决方案1】:

您可以将 df 转换为 Sets ,在比较数据时会忽略索引,然后使用set symmetric_difference

ds1 = set([ tuple(values) for values in df1.values.tolist()])
ds2 = set([ tuple(values) for values in df2.values.tolist()])

ds1.symmetric_difference(ds2)
print df1 ,'\n\n'
print df2,'\n\n'

print pd.DataFrame(list(ds1.difference(ds2))),'\n\n'
print pd.DataFrame(list(ds2.difference(ds1))),'\n\n'

df1

id  Name  score isEnrolled               Comment
0  111  Jack   2.17       True  He was late to class
1  112  Nick   1.11      False             Graduated
2  113   Zoe   4.12       True                   NaN 

df2

    id  Name  score isEnrolled               Comment
0  111  Jack   2.17       True  He was late to class
1  112  Nick   1.21      False             Graduated
2  113   Zoe   4.12      False           On vacation 

输出

     0     1     2      3          4
0  113   Zoe  4.12   True        NaN
1  112  Nick  1.11  False  Graduated 


     0     1     2      3            4
0  113   Zoe  4.12  False  On vacation
1  112  Nick  1.21  False    Graduated 

【讨论】:

    【解决方案2】:

    试试这个:

    A = pd.read_csv("c1.csv", header=None, usecols=[0], names=['col']).drop_duplicates()
    B = pd.read_csv("c2.csv", header=None, usecols=[0], names=['col']).drop_duplicates()
    # A - B
    pd.merge(A, B, on='col', how='left', indicator=True).query("_merge == 'left_only'")
    # B - A
    pd.merge(A, B, on='col', how='right', indicator=True).query("_merge == 'right_only'")
    

    【讨论】:

      【解决方案3】:

      我觉得你需要merge:

      A = pd.DataFrame({'product id':   [1455,5452,3775],
                          'serial number':[44,55,66]})
      
      print (A)
      
      B = pd.DataFrame({'product id':   [7000,2000,1000],
                          'serial number':[44,55,77]})
      
      print (B)
      
      print (pd.merge(A, B, on='serial number'))
         product id_x  serial number  product id_y
      0          1455             44          7000
      1          5452             55          2000
      

      【讨论】:

      • 只需要稍作修改,如何在上面的 sn-p 中将两个文件名作为输入,而不是对值进行硬编码?
      • @user7609711 如果您有 xlsx 文件,请使用 a = pd.read_csv("path-to-file")a = pd.read_excel("path-to-file")。虽然您需要openpyxl 才能打开 excel 文件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-24
      • 2022-01-17
      • 2016-10-18
      • 2018-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多