将两个 csv 文件与 python pandas 进行比较
Posted
技术标签:
【中文标题】将两个 csv 文件与 python pandas 进行比较【英文标题】:Compare two csv files with 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.
【问题讨论】:
您可以添加一些示例数据和所需的输出吗?因为有点不清楚到底需要什么。 【参考方案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 文件。以上是关于将两个 csv 文件与 python pandas 进行比较的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Python Pandas 合并多个 CSV 文件
如何通过在 Python 中将两个列表合并为一个,使用 CSV 模块或 Pandas 写入 csv 或 Excel 文件?