如何比较两个csv文件中的特定列并将差异输出到第三个文件

2024-10-01 09:41:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个名为test1.csvtest2.csv的csv文件,它们都有一个名为“Name”的列。我想比较这两个文件之间的Name列中的每一行,并输出与第三个文件不匹配的行。我见过一些使用熊猫的例子,但没有一个适合我的情况。有人能帮我写一个剧本吗

Test2将被更新,以包含test1中的所有值以及test1中未包含的新值(这些值是我希望保存到第三个文件中的值)

列的外观示例如下:

test1.csv:

Name     Number    Status
gfd454   456       Disposed
3v4fd    521       Disposed
th678iy  678       Disposed

test2.csv

Name     Number    Status
gfd454   456       Disposed
3v4fd    521       Disposed
th678iy  678       Disposed
vb556h   665       Disposed    

Tags: 文件csvnamenumberstatus情况例子剧本
3条回答

见下文

其思想是将名称读入pythonset数据结构,并通过执行set子结构来查找新名称

1.csv:

Name Number
A 12
B 34 
C 45 

2.csv

Name Number
A 12
B 34
C 45
D 77
Z 67

下面的代码将打印{'D','Z'},这是新名称

def read_file_to_set(file_name):
    with open(file_name) as f:
        return set(l.strip().split()[0] for x,l in enumerate(f.readlines()) if x > 0)



set_1 = read_file_to_set('1.csv')
set_2 = read_file_to_set('2.csv')
new_names = set_2 - set_1
print(new_names)

这应该是直截了当的-解决方案假设file2的内容相同或更长,因此项目仅附加到file2

import pandas as pd

df1 = pd.read_csv(r"C:\path\to\file1.csv")
df2 = pd.read_csv(r"C:\path\to\file2.csv")

# print(df1)
# print(df2)

df = pd.concat([df1, df2], axis=1)

df['X'] = df['A'] == df['B']
print(df[df.X==False])

df3 = df[df.X==False]['B']
print(df3)
df3.to_csv(r"C:\path\to\file3.csv")

如果项目的顺序是任意的,您可以使用df.isin(),如下所示:

import pandas as pd

df1 = pd.read_csv(r"C:\path\to\file1.csv")
df2 = pd.read_csv(r"C:\path\to\file2.csv")

df = pd.concat([df1, df2], axis=1)

df['X'] = df['B'].isin(df['A'])
df3 = df[df.X==False]['B']
df3.to_csv(r"C:\path\to\file3.csv")

我创建了以下两个文件:

A
1_in_A
2_in_A
3_in_A
4_in_A

和file2.csv:

B
2_in_A
1_in_A
3_in_A
4_in_B
5_in_B

用于测试。数据帧df如下所示:

|    | A      | B      | X     |
| -:|:   -|:   -|:   |
|  0 | 1_in_A | 2_in_A | True  |
|  1 | 2_in_A | 1_in_A | True  |
|  2 | 3_in_A | 3_in_A | True  |
|  3 | 4_in_A | 4_in_B | False |
|  4 | nan    | 5_in_B | False |

我们只选择标记为False的项目

此答案假设数据按示例中的方式排列:

import pandas as pd

# "read" each file
df1 = pd.DataFrame({'Name': ['gfd454', '3v4fd', 'th678iy']})
df2 = pd.DataFrame({'Name': ['gfd454', '3v4fd', 'th678iy', 'fdvs']})

# make column names unique
df1 = df1.rename(columns={'Name': 'Name1'})
df2 = df2.rename(columns={'Name': 'Name2'})

# line them up next to each other
df = pd.concat([df1, df2], axis=1)

# get difference
diff = df[df['Name1'].isnull()]['Name2']  # or df[df['Name1'] != df['Name2']]['Name2']

# write
diff.to_csv('test3.csv')

相关问题 更多 >