【问题标题】:how to compare two csv file in python and flag the difference?如何比较python中的两个csv文件并标记差异?
【发布时间】:2022-01-08 11:07:36
【问题描述】:

我是 python 新手。请帮助我。 在这里,我有两组 csv 文件。我需要比较并输出差异,例如更改的数据/删除的数据/添加的数据。这是我的例子

file 1:
Sn  Name  Subject   Marks  
1   Ram      Maths     85
2   sita    Engilsh    66
3   vishnu  science    50
4   balaji  social     60

file 2:
Sn  Name    Subject   Marks
1   Ram     computer  85   #subject name have changed
2   sita    Engilsh   66
3   vishnu  science   90   #marks have changed
4   balaji  social    60
5   kishor  chem      99   #added new line

Output - i need to get like this :

Changed Items: 
1   Ram      computer  85
3   vishnu    science  90
Added item:
5   kishor    chem   99
Deleted item:
.................

我导入了 csv 并通过带有红线的 for 循环进行了比较。我没有得到期望的输出。 在标记文件 1 和文件 2(csv 文件)之间添加和删除的项目时,我很困惑。请建议有效的代码人员。

【问题讨论】:

  • 比较数据帧的关键是什么? SnName?

标签: python python-3.x pandas csv export-to-csv


【解决方案1】:

这里的想法是使用melt 展平您的数据框以比较每个值:

# Load your csv files
df1 = pd.read_csv('file1.csv', ...)
df2 = pd.read_csv('file2.csv', ...)

# Select columns (not mandatory, it depends on your 'Sn' column)
cols = ['Name', 'Subject', 'Marks']

# Flat your dataframes
out1 = df1[cols].melt('Name', var_name='Item', value_name='Old')
out2 = df2[cols].melt('Name', var_name='Item', value_name='New')
out = pd.merge(out1, out2, on=['Name', 'Item'], how='outer')

# Flag the state of each item
condlist = [out['Old'] != out['New'],
            out['Old'].isna(),
            out['New'].isna()]

out['State'] = np.select(condlist, choicelist=['changed', 'added', 'deleted'], 
                         default='unchanged')

输出:

>>> out
     Name     Item      Old       New      State
0     Ram  Subject    Maths  computer    changed
1    sita  Subject  Engilsh   Engilsh  unchanged
2  vishnu  Subject  science   science  unchanged
3  balaji  Subject   social    social  unchanged
4     Ram    Marks       85        85  unchanged
5    sita    Marks       66        66  unchanged
6  vishnu    Marks       50        90    changed
7  balaji    Marks       60        60  unchanged
8  kishor  Subject      NaN      chem    changed
9  kishor    Marks      NaN        99    changed

【讨论】:

  • 我通过使用 pandas 导入运行了这段代码,但我遇到了这个错误 File "pandas\_libs\parsers.pyx", line 801, in pandas._libs.parsers.TextReader.read_low_memory File "pandas\_libs\parsers.pyx", line 857, in pandas._libs.parsers.TextReader._read_rows File "pandas\_libs\parsers.pyx", line 843, in pandas._libs.parsers.TextReader._tokenize_rows File "pandas\_libs\parsers.pyx", line 1925, in pandas._libs.parsers.raise_parser_error pandas.errors.ParserError: Error tokenizing data. C error: Expected 18 fields in line 3, saw 28
  • 最初我 print(df1) 但通过上述问题似乎 它甚至没有开始读取我的 csv 文件
  • 如何加载文件?你有多少记录?
  • 它有 600 行,15 到 20 列(csv 格式) import pandas as pd df1 = pd.read_csv('file1.csv') df2 = pd.read_csv('file2.csv')
【解决方案2】:
count, flag = 0, 1
for i, j in zip(df1.values, df2.values):
    if sum(i == j) != 4:
        if flag:
            print("Changed Items:")
            flag = 0
        print(j)
    count += 1

if count != len(df2):
    print("Newly added:")
    print(*df2.iloc[count:, :].values)

【讨论】:

  • 我通过使用 pandas 导入运行了这段代码,但我遇到了这个错误 File "pandas\_libs\parsers.pyx", line 801, in pandas._libs.parsers.TextReader.read_low_memory File "pandas\_libs\parsers.pyx", line 857, in pandas._libs.parsers.TextReader._read_rows File "pandas\_libs\parsers.pyx", line 843, in pandas._libs.parsers.TextReader._tokenize_rows File "pandas\_libs\parsers.pyx", line 1925, in pandas._libs.parsers.raise_parser_error pandas.errors.ParserError: Error tokenizing data. C error: Expected 18 fields in line 3, saw 28
  • 最初我 print(df1) 但通过上述问题似乎 它甚至没有开始读取我的 csv 文件
  • - 导入 pandas 和 pd.read_csv(filename) - 然后你得到了 df1 和 df2,那么你可以继续进行吗
  • 是的,正如你提到的,我只使用了 它有 600 行,15 到 20 列(csv 格式) import pandas as pd df1 = pd.read_csv('file1.csv') df2 = pd.read_csv('file2.csv') 与上述相同的错误
  • 如果两个文件的编号不同。列,那么我认为这会解决这个问题。我上面提到的代码 3 没有行 if sum(i == j) != 4: 这里 4 是根据您给定的示例数据的列号
猜你喜欢
  • 2014-06-08
  • 2016-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多