我有 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