两个CSV文件的列式差异

2024-07-03 07:29:15 发布

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

我试着比较两个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:

^{pr2}$

期望输出(相对于CSV2):

添加:

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

已删除:

{} #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. 

编辑:

这里 添加的字典应该给出任何额外的列及其值!样品名称(何时!样片名和!CSV1和CSV2中的Sample_geo_accessment match,在CSV1中找到(如果它的列数多于CSV2)

Deleted dictionary执行与Added相似的操作,只是它查找已删除的列。在

Changed给出了文件及其头中不同的值。在

所以基本上它应该比较apple和apples(当头名称匹配时),而不是apples和oranges(按列位置)


Tags: 文件samplenamesourcefbtitleonpublic
1条回答
网友
1楼 · 发布于 2024-07-03 07:29:15

你的问题仍然很难界定。首先我们得破译这个问题。 您说的是“diff two CSV files”,这通常意味着按行区分,可能首先是按索引列['对行进行重新排序!样品名称','!登录示例']

但实际上您需要列方面的差异。具体来说,您想知道在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]

输出:

^{pr2}$

似乎您还需要我们对列进行重新排序,以便df1、df2的顺序相同。 但你还没告诉我们应该如何比较!示例“源代码”“名称”“ch1”,因为“FB”“0”“12wk”!=“12周”。在

在你弄清楚你的要求之前,我不会再做这个了。在

相关问题 更多 >