水平组合 csv 文件的最快方法



我有 3 个大型 csv 文件,大小从 1.5GB 到 1.8GB 不等。每个文件彼此具有不同的指标列。

File1 (columns):       key, metric1, metric2
File1 (sample values): k1,  m1,      m2
                       k2,  m1,      m2
File2 (columns):       key, metric3, metric4, metric5
File2 (sample values): k1,  m3,      m4,      m5
File3 (columns):       key, metric6, metric7
File3 (sample values): k1,  m6,      m7
                       k2,  m6,      m7

我想将这 3 个文件合并为下面的一个文件:

Output (columns):       key, metric1, metric2, metric3, metric4, metric5, metric6, metric7
Output (sample values): k1,  m1,      m2,      m3,      m4,      m5,      m6,      m7
                        k2,  m1,      m2,      null,    null,    null,    m6,      m7

我尝试使用pandas,需要 40 分钟才能完成。我想这是由于文件大小。

有没有更快的方法可以水平梳理大型csv文件?

编辑:

以下是我使用的代码:

col_to_keep = ['a','b','c']
file_ptn = os.path.join('raw','*foo_bar*.csv')
files = glob.glob(file_ptn)
try:
        df = reduce(lambda left,right: pd.DataFrame.combine_first(left,right), [pd.read_csv(f,dtype={'[UPC]': str}).set_index(sch_inx_region) for f in files])
        df = df[col_to_keep]
        df.to_csv('output.csv', compression = None, encoding = 'utf-8')
except Exception as e:
    msg = '--- [combine] Writing output file failed! Error: '+str(e)
    print(msg)

大多数时间将是文件 I/O。以下是非熊猫解决方案供您测试:

import glob
import csv
from collections import defaultdict
data = defaultdict(dict)
metrics = []
for csv_filename in glob.glob('foo_bar*.csv'):
    with open(csv_filename, 'r', newline='') as f_input:
        csv_input = csv.reader(f_input)
        key_header, *header = next(csv_input)
        metrics.extend(header)
        for row in csv_input:
            key = data[row[0]]
            for metric, value in zip(header, row[1:]):
                key[metric] = value
metrics = sorted(metrics)            
with open('output.csv', 'w', newline='') as f_output:
    csv_output = csv.writer(f_output)
    csv_output.writerow([key_header] + metrics)
    for key in sorted(data.keys()):
        csv_output.writerow([key] + [data[key].get(metric, 'null') for metric in metrics])

对于示例文件,这将创建一个输出 CSV 文件:

key,metric1,metric2,metric3,metric4,metric5,metric6,metric7
k1,m1,m2,m3,m4,m5,m6,m7
k2,m1,m2,null,null,null,m6,m7

它使用defaultdict为每个 CSV 文件中的每个键构建字典,然后将所有结果写入输出文件。如果给定键没有匹配的指标,则写入null

由于一周后您还没有找到合适的pandas答案,也许可以尝试使用 shell 中的 join,使用 , 作为分隔符:

join -t, file[12].csv | join -t, - file3.csv

最新更新