gpt4 book ai didi

python - 如果行不相等,如何通过公共(public)列合并两个 csv 文件?

转载 作者:太空宇宙 更新时间:2023-11-04 10:44:00 24 4
gpt4 key购买 nike

我有一组 100 个文件。包含美国各州人口普查信息的 50 个文件。其他五十个是地理数据,需要与每个州的正确文件合并。

对于每个州,人口普查文件及其对应的地理文件通过一个公共(public)变量 LOGRECNO 关联,即人口普查文件中的第 10 列和地理文件中的第 7 列。

问题是地理文件比人口普查文件多行;我的人口普查数据未涵盖某些地理位置子集,因此行数少于地理数据文件。

如何将人口普查数据与地理日期合并(仅保留人口普查数据所在的行/地理位置,不关心其余部分)?

我是 Python 的新手,我知道如何在 Python 中执行基本的 csv 文件输入/输出。同时操作 2 个 csvs 令人困惑。

例子:

sample_state_census.csv

Varname 1 Varname 2 ... Varname 10 (LOGRECNO) ... Varname 16000
xxx xxx ... 1 ... xxx
xxx xxx ... 2 ... xxx
...
...
xxx xxx ... 514 ... xxx
xxx xxx ... 1312 ... xxx
...
...
xxx xxx ... 1500 ... xxx

sample_state_geo.csv

GeoVarname 1 GeoVarname 2 ... GeoVarname 7 (LOGRECNO) ... GeoVarname 65
yyy yyy ... 1 ... yyy
yyy yyy ... 2 ... yyy
...
...
yyy yyy ... 514 ... yyy
yyy yyy ... 515 ... yyy
...
...
yyy yyy ... 1500 ... yyy

预期输出(不要合并 sample_state_census.csv 中不存在的 LOGRECNO 值的行)

Varname 1 Varname 2 ... Varname 10 (LOGRECNO) GeoVarname 1 GeoVarname 2 ... GeoVarname 65 Varname 11... Varname 16000 
xxx xxx ... 1 yyy yyy ... yyy xxx ... xxx
xxx xxx ... 2 yyy yyy ... yyy xxx ... xxx
...
...
xxx xxx ... 514 yyy yyy ... yyy xxx ... xxx
xxx xxx ... 1312 yyy yyy ... yyy xxx ... xxx
...
...
xxx xxx ... 1500 yyy yyy ... yyy xxx ... xxx

最佳答案

将较短文件中的数据读入内存,读入以 LOGRECNO 行为键的字典:

import csv

with open('sample_state_census.csv', 'rb') as census_file:
reader = csv.reader(census_file, delimiter='\t')
census_header = next(reader, None) # store header
census = {row[9]: row for row in reader}

然后使用这个字典来匹配地理数据,写出匹配:

with open('sample_state_geo.csv', 'rb') as geo_file:
with open('outputfile.csv', 'wd') as outfile:
reader = csv.reader(geo_file, delimiter='\t')
geo_header = next(reader, None) # grab header
geo_header.pop(6) # no need to list LOGRECNO header twice

writer = csv.writer(outfile, delimiter='\t')
writer.writerow(census_header + geo_header)

for row in reader:
if row[6] not in census:
# no census data for this LOGRECNO entry
continue
# new row is all of the census data plus all of geo minus column 7
newrow = census[row[6]] + row[:6] + row[7:]
writer.writerow(newrow)

这一切都假设人口普查文件不会大到占用太多内存。如果是这种情况,您将不得不改用数据库(将所有数据读入 SQLite 数据库,以同样的方式再次匹配地理数据)。

关于python - 如果行不相等,如何通过公共(public)列合并两个 csv 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18689453/

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