gpt4 book ai didi

python - 如果第一列匹配,则将一个 csv 中的行追加到另一个 csv

转载 作者:行者123 更新时间:2023-12-01 08:24:28 33 4
gpt4 key购买 nike

我有两个 csv 文件,行相同但列不同:

$cat file1

category,a,b,c,d,e
apple,0,0,0,0,0
bear,1,1,1,1,1

$cat file2

category,f,g,h,i,j
bear,10,10,10,10,10
apple,5,5,5,5,5

预期输出:

category,a,b,c,d,e,f,g,h,i,j
apple,0,0,0,0,0,5,5,5,5,5
bear,1,1,1,1,1,10,10,10,10,10

file1file2 都是无序的,并且具有相同数量的匹配行(约 15000 行)。 file1 有约 1000 列,file2 有约 16000 列。我使用了以下方法:

import csv

with open ("file1.csv") as f:
first = {rows[0]:rows[1:] for rows in list(csv.reader(f))}


with open("file2.csv") as f:
for row in csv.reader(f):
if row[0] in first:
first[row[0]].extend(row[1:])

# print(first)
# {'category': ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'], 'apple': ['0', '0', '0', '0', '0', '5', '5', '5', '5', '5'], 'bear': ['1', '1', '1', '1', '1', '10', '10','10', '10', '10']}

我觉得我已经接近了,但我似乎无法使用与上述预期输出相同的格式编写first

顺便说一句,对文件进行排序然后追加是否有意义?它们具有完全相同的行数和类别。

最佳答案

您已经非常接近了,但存在 (IIUC) 一些复杂的因素。主要是 file_afile_b 的长度不同,因此可以安全地假设它们在 A 列中可能有不相交的类别数。即,一个类别(bear/apple 等)可能存在于一个文件中,而不存在于另一个文件中。

因此,我使用 defaultdict。这意味着,如果 key 不存在,它将自动创建,并存储一个空列表。如果我们以前见过该键,我们只需根据它扩展现有列表即可。如果没有,我们会以完全相同的方式对待它,但只是扩展现有的默认空列表。

您可以通过在 file_afile_b 中放置一个全新的行来测试这一点;代码将正常运行。

此外,通过打包在函数(build_output)中,我们只需要一次with open()...代码。如果您想添加另一个文件,只需输入output = build_output('file_c.csv', output),它将以相同的方式添加。

最后,我们使用第一列作为字典中的键,使用文件中的所有其余值作为“值”。我们需要将它们连接在一起作为一个列表。我们可以使用第一列作为键,然后根据该键存储整行,但是如果键不多次出现,那么将其写回会变得困难。相反,将括在一个列表中,并将其与值列表连接起来,以给出一个我们可以写在一行上的单个列表。

import csv

from collections import defaultdict

output = defaultdict(list)


def build_output(file_name, output_obj):
with open(file_name) as infile:
reader_obj = csv.reader(infile)
for row in reader_obj:
output_obj[row[0]].extend(row[1:])
return output_obj


def write_output(output):
with open('output.csv', 'w', newline='') as outfile:
writer = csv.writer(outfile)
for key, value in output.items():
row = [key] + value
writer.writerow(row)


output = build_output('file_a.csv', output)
output = build_output('file_b.csv', output)
write_output(output)

关于python - 如果第一列匹配,则将一个 csv 中的行追加到另一个 csv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54371231/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com