2015-02-13 3 views
0

Я пытаюсь сравнить два файла CSV (и многие другие, как показано ниже). Я пробовал много способов, используя списки, диктофон и многое другое, но ничего не дал мне требуемый результат. Я хочу сравнить все те строки, которые имеют одинаковые значения! Sample_title и! Sample_geo_accession (позиции которых меняются). Я боролся с этим уже три дня и не мог прийти к решению. Я высоко ценю любую помощь.Разница в столбцах двух файлов CSV

CSV1:

!Sample_title,!Sample_geo_accession,!Sample_status,!Sample_type,!Sample_source_name_ch1 
body,GSM501443,Public on july 22 2010,ribonucleic acid,FB_50_12wk 
foreign,GSM501445,Public on july 22 2010,ribonucleic acid,FB_0_12wk 
HJCENV,GSM501446,Public on july 22 2010,ribonucleic acid,FB_50_12wk 
AsDW,GSM501444,Public on july 22 2010,ribonucleic acid,FB_0_12wk 

CSV2:

!Sample_title,!Sample_type,!Sample_source_name_ch1,!Sample_geo_accession 
AsDW,ribonucleic acid,FB_0,GSM501444 
foreign,ribonucleic acid,FB,GSM501449 
HJCENV,RNA,12wk,GSM501446 

Желаемый выход (по отношению к CSV2):

Добавлено:

{!Sample_status:{HJCENV:Public on july 22 2010,AsDW:Public on july 22 2010}} #Added columns, not rows. 

Deleted:

{} #Since nothing's deleted with respect to CSV2 

Изменено:

{!Sample_title:AsDW,!Sample_source_name_ch1:(FB_0_12wk,FB_0),!Sample_geo_accession:GSM501444 
!Sample_title:HJCENV,!Sample_type:(ribonucleic acid,RNA),!Sample_source_name_ch1:(FB_50_12wk,12wk),!Sample_geo_accession:GSM501446} 
#foreign,ribonucleic acid,FB,GSM501449 doesn't come here since the !Sample_geo_accession column values didn't match. 

EDIT:

Здесь словарь Добавлено должны давать какие-либо дополнительные столбцы и их значения для каждого Sample_title (! Когда Sample_title и Sample_geo_accession матч в CSV1 и CSV2) которые находятся в CSV1 (если у него больше столбцов, чем CSV2)

Удаленный словарь делает аналогичную вещь, как Добавлено, за исключением того, что он ищет удаленные столбцы.

Изменено задает значения, которые различаются как в файлах, так и в их заголовке.

Так в основном он должен сравнивать яблоки и яблоки (когда имена заголовков совпадают), а не яблоки и апельсины (по положению столбца)

+0

Можете ли вы использовать 'index', чтобы найти, какие позиции вы ищете в строке? –

+0

по индексу, если вы имеете в виду номера столбцов hardcoding, нет, поскольку они могут меняться от файла к файлу. @ kiran.koduru – abn

+0

Можете ли вы также объяснить, что создала эта структура словаря для _Added_ и _Changed_? Я не понимаю, что там делает. –

ответ

1

Ваш вопрос по-прежнему очень плохо определены. Сначала нам пришлось расшифровать вопрос. Вы сказали, «Diff два CSV файлов», которые обычно означают строчном посмотреть различие, может быть первым с строчном переназначения по столбцам индекса [ «! Sample_title», «! Sample_geo_accession»]

Но вы на самом деле хотели столбца -wise отличается. В частности, вы хотите знать, какие столбцы были добавлены в csv2, какие столбцы были удалены, и для общих столбцов, какие записи (строки) были изменены в csv2. Теперь, Вы хотите, чтобы эти различия вычислялись и представлялись отдельными рядами или одновременно по всем столбцам?

Что-то вроде следующего:

import pandas as pd 
pd.options.display.width = 200 

df1 = pd.read_csv('1.csv', index_col=['!Sample_title','!Sample_geo_accession']) 
df2 = pd.read_csv('2.csv', index_col=['!Sample_title','!Sample_geo_accession']) 

cols_common = (df1.columns & df2.columns).tolist() 
cols_added = (df2.columns - df1.columns).tolist() 
cols_deleted = (df1.columns - df2.columns).tolist() 

print "\nAdded", df2.ix[:, cols_added] 
print "\nDeleted", df1.ix[:, cols_deleted] 
print "\nChanged", df2.ix[:, cols_common] 

Выход:

Added: 
[(AsDW, GSM501444), (foreign, GSM501449), (HJCENV, GSM501446)] 

Deleted            !Sample_status 
!Sample_title !Sample_geo_accession       
body   GSM501443    Public on july 22 2010 
foreign  GSM501445    Public on july 22 2010 
HJCENV  GSM501446    Public on july 22 2010 
AsDW   GSM501444    Public on july 22 2010 

Changed           !Sample_type !Sample_source_name_ch1 
!Sample_title !Sample_geo_accession           
AsDW   GSM501444    ribonucleic acid     FB_0 
foreign  GSM501449    ribonucleic acid      FB 
HJCENV  GSM501446       RNA     12wk 

Похоже, вы хотите, чтобы мы изменить порядок столбцов так df1, df2 находятся в том же порядке. Но вы не сказали нам, как мы должны сравнивать '! Sample_source_name_ch1', потому что 'FB_0_12wk'! = '12wk'.

Я больше не буду работать над этим, пока вы не зафиксируете ясность того, что вы просите.

+0

Спасибо. Жаль не было. Я не хотел переупорядочивать строки, потому что, в первую очередь, число самих строк. Я подумал, что очевидно, что «FB_0_12wk»! = '12wk', поэтому он должен попадать в измененную категорию. – abn

Смежные вопросы