【问题标题】:Issue in comparing 2 csv files data比较 2 个 csv 文件数据时的问题
【发布时间】:2021-07-19 04:13:39
【问题描述】:

我有 2 个 csv 文件,我想比较并打印 fil2.csv 中不同或不存在的行。

value data
a      67
b      654
c      87
d      789
e      23

file2.csv

value data
a      67
b      654
c      87
d      7

想要的输出

d      789
e      23

我尝试了这段代码,但它无法打印差异。

reader1 = csv.reader(open(file1.csv, 'r'), delimiter=',', quotechar='"')
data = next(reader1)
reader2 = csv.reader(open(file2.csv, 'r'), delimiter=',', quotechar='"')
data2 = next(reader2)
if (data[0] != data2[0]) and (data[1] != data2[1]):
    print(data[0] , data[1])

【问题讨论】:

  • 您的示例中的第 0 列值匹配,因此您的 if 语句将始终为 false,因此不会打印任何内容。
  • 它也会忽略缺失值吗? @RufusVS
  • 要确定处理数据的最佳方式,您需要了解数据集。第一列中的数字是否都是唯一且升序的?或者文件中可以有重复或随机顺序?
  • 它们不是重复的,将按顺序排列@RufusVS

标签: python pandas numpy csv file-handling


【解决方案1】:

你可以用几个布尔掩码做到这一点:

import pandas as pd

d1 = [{'value': 'a', 'data': 67},
 {'value': 'b', 'data': 654},
 {'value': 'c', 'data': 87},
 {'value': 'd', 'data': 789},
 {'value': 'e', 'data': 23}]

d2 = [{'value': 'a', 'data': 67},
 {'value': 'b', 'data': 654},
 {'value': 'c', 'data': 87},
 {'value': 'd', 'data': 7}]

df1 = pd.DataFrame(d1)
df2 = pd.DataFrame(d2)

print(df1)

  value  data
0     a    67
1     b   654
2     c    87
3     d   789
4     e    23

print(df2)

value  data
0     a    67
1     b   654
2     c    87
3     d     7

not_in = ~df1['value'].isin(df2['value'])

data_diff = df1[~not_in]['data'] != df2['data']

print(df1[not_in | data_diff])

  value  data
3     d   789
4     e    23

对于这个答案,df1 和 df2 通过 pd.read_csv() 代替 reader1 和 reader2。

【讨论】:

  • 使用此代码,我得到 - KeyError: 'value' @jch
  • @Priyx 在执行此代码之前验证 df1 和 df2 中是否存在“value”和“data”列。
  • @Priyx 我在回答中包含了适合我的完整解决方案。
  • @Priyx 另请注意,此代码仅在“值”和“数据”都是列时才有效。如果 'value 是一个索引,则此代码将失败并出现 KeyError: 'value'
  • 其实 value 和 data 就是 index,我也举了个例子@jch
猜你喜欢
  • 1970-01-01
  • 2019-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-09
  • 2020-03-03
相关资源
最近更新 更多