如何在Python中根据特定变量(而不是逐行)比较两个csv文件?

如何在Python中根据特定变量(而不是逐行)比较两个csv文件?,python,pandas,csv,comparison,difference,Python,Pandas,Csv,Comparison,Difference,我有两个从Json文件转换的csv文件(复制EXCEL中的文本并转换为csv), 格式有点混乱,我想根据ID号比较整行,但问题是ID号在每行的不同列中,我想打印具有相同ID号的两行之间的差异 以下是数据示例(我无法重命名每一列,因为每一列都有不同的变量值): CSV_01: age 10 height 150 ID 1001 sex F age 10 height 150 ID 1001 sex M ID 1001 height 150 age 12

我有两个从Json文件转换的csv文件(复制EXCEL中的文本并转换为csv), 格式有点混乱,我想根据ID号比较整行,但问题是ID号在每行的不同列中,我想打印具有相同ID号的两行之间的差异

以下是数据示例(我无法重命名每一列,因为每一列都有不同的变量值):

CSV_01:

age 10   height 150   ID  1001     sex F
age 10   height 150   ID  1001     sex M
ID 1001  height 150   age  12      sex M
age 10   ID  2002     height 151   sex F
age 10   height 150   ID  2002     sex M
CSV_02:

age 10   height 150   ID  2002     sex F
age 10   height 150   ID  1001     sex M
ID 1001  height 150   age  12      sex M
age 10   ID  1001     height 151   sex F
age 10   height 150   ID  2002     sex M
我有近1000行和500列(每行还包含重复的相同ID),如下所示: 年龄10身高150内径1001性别M。。。身份证号码1001

但我认为这并不重要,但变量的顺序不同,这意味着我最终要将CVS_01中的前3行与CSV_02中的第2、3、4行进行比较(因为它们具有相同的ID),但这只是一个示例,因此在我的大数据集中应该是不同的行号

以下是我在Python中导入csv文件后所做的尝试:

resultBool01 = (CSV_01 != CSV_02).stack()  # Create Frame of comparison booleans
resultdiff01 = pd.concat([CSV_01.stack()[resultBool01], CSV_02.stack()[resultBool01]], 
axis=1)
resultdiff01.columns=["output_01", "output_02"]

这给了我每一行之间的差异(即:两个文件之间的第一行),但这不是我想要的,因为在第一行中,它们具有不同的ID。我已经被困了几天,不确定这是否是正确的方向,但如果我比较json或txt文件,可能会更困难。有人能帮我吗?非常感谢。

您是否尝试过将数据转换成字典

虽然csv文件有点凌乱,但至少它们有一个明确定义的结构,并且每个字段名都位于其引用值之前

尽管有空格和其他特殊字符,但您可以先解析每一行的csv,将每一行(或条目)保存为唯一数据点的字典,并将其附加到字典列表中。然后,您可以直接对其进行操作,也可以导出正确排序和对齐的csv文件供以后使用

(我还不能评论,所以我希望这就足够了,否则我也很乐意为实际代码提供帮助)

增编:

代码可能不适合您的特定文件,但它可以作为开发您的文件的蓝图

基本上,以csv(真正的tsv)格式表示的每一行是:

fieldname   value   fieldname2   value2   fieldname3   value3
这段代码将读取它,并将值2保存为新字典中键“fieldname2”的值,然后将其保存在列表中,然后从函数返回

def filereader(filename):
        _out = []
        with open(filename, 'r',  newline='', encoding='?????') as csvfile:
                csvfile = csv.reader(csvfile, delimiter='\t')
                for row in csvfile:
                        rowDict = {}
                        rowDict[row[0]] = row[1]
                        rowDict[row[2]] = row[3]
                        rowDict[row[4]] = row[5]
                        _out.append(rowDict)
        return _out

我是Python新手,你介意给我看一下代码吗,谢谢。当然可以。首先:CSV文件的实际外观如何?每个值选项卡是否与下一个分开?如果是这样的话,您可以这样做(见上文adendum)我运行了函数和filereader('run_01.csv'),它给了我一个错误:TypeError:'delimiter'是open()的无效关键字参数,所以每个值选项卡都与csv文件中的下一个分开,因为我在EXCEL中使用了'delimiter',然后将其转换为csv,现在很复杂,你介意写一个例子,说明如何将csv df编入字典并进行比较吗?谢谢你,这部分在我的实际dta集合中不起作用。”行[0]]=行[1]行[2]=行[3]行[4]=行[5]'是的,我的错。我将分隔符放错了位置(已修复)。如果成功读取该文件,请将其内容打印到shell!它看起来像什么?它是列表结构吗?一根绳子?我只是偏离了你在上面的陈述中所做的假设——实际的文件可能不符合这个假设。我的代码假定csv文件是以制表符分隔的,其中每个项目都作为列表中的一个项目读入,文件的每一行都是一个新列表。