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

时间:2018-01-31 22:36:16

标签: python pandas 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)

2 个答案:

答案 0 :(得分:0)

大部分时间都是文件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,则会写入。{/ p>

答案 1 :(得分:0)

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

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