我有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)
答案 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