Как сравнить два файла CSV с одинаковыми столбцами, но разными значениями?

Вот моя проблема, мне нужно сравнить два сканирования procmon, которые я преобразовал в файлы CSV.

Оба файла имеют одинаковые имена столбцов, но, очевидно, их содержимое различается. Мне нужно проверить «Путь» (5-й столбец) от первого файла ко второму файлу и распечатать ВСЮ строку второго файла в третьем CSV, если есть соответствующие совпадения.

Я довольно долго гуглил и, похоже, не могу заставить это работать так, как я хочу, любая помощь приветствуется!

Я пробовал множество онлайн-инструментов и других скриптов на Python, но безрезультатно.


person Community    schedule 04.10.2019    source источник


Ответы (2)


Вы пробовали использовать pandas и numpy вместе?

Это выглядело бы примерно так:

import pandas as pd
import numpy as np

#get your second file as a Dataframe, since you need the whole rows later
file2 = pd.read_csv("file2.csv")

#get your columns to compare
file1Column5 = pd.read_csv("file1.csv")["name of column 5"]
file2Column5 = file2["name of column 5"]

#add a column where if values match, row marked True, else False
file2["ColumnsMatch"] = np.where(file1Column5 == file2Column5, 'True', 'False')

#filter rows based on that column and remove the extra column
file2 = file2[file2['ColumnsMatch'] == 'True'].drop('ColumnsMatch', 1)

#write to new file
file2.to_csv(r'file3.csv')
person sigma1510    schedule 04.10.2019

Просто напишите для таких вещей свой собственный код. Вероятно, это проще, чем вы ожидаете.

#!/usr/bin/env python

import pandas as pd

# read the csv files
csv1 = pd.read_csv('<first_filename>')
csv2 = pd.read_csv('<sencond_filename>')

# create a comapare series of the files
iseq = csv1['Path'] == csv2['Path']

# push compared data with 'True' from csv2 to csv3
csv3 = pd.DataFrame(csv2[iseq])

# write to a new csv file
csv3.to_csv('<new_filename>')

person organicData    schedule 04.10.2019
comment
Ни твоя, ни чужая программа не работает. Я понимаю, что вы написали, и мне очень грустно, что я продолжаю усложнять вещи, которые должны быть, но вот ошибка, которую я получаю: ValueError: Can only compare identically-labeled Series objects Но ... столбцы названы точно так же, в чем дело? - person ; 04.10.2019
comment
Ошибка указывает на то, что ваши входные файлы разные, скорее всего, в них разное количество процессов. Так что просто сравните такое же количество строк, iseq = csv1[:len(csv2)]['Path'] == csv2['Path'] - person organicData; 04.10.2019
comment
Я только что понял, что вы можете принять во внимание сортировку ваших файлов, например, csv1 = csv1.sort_values(by='id') для обоих файлов. - person organicData; 04.10.2019
comment
Пробовал сортировать по столбцу Путь, но все еще ошибки. Моя реализация неверна? (прежде чем мы создадим серию сравнения) csv1 = csv1.sort_values(by='Path') csv2 = csv2.sort_values(by='Path') - person ; 04.10.2019