gpt4 book ai didi

python - 时间高效的宽到长转换 Pandas

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

我有一个包含大约 5400 万行的数据集,我需要从一个制表符分隔的文本文件中读取它,将其从宽格式转换为长格式,然后写入一个新的文本文件。数据太大,内存放不下,所以我一直在使用迭代器。我想将三个独立的变量从宽移到长,所以我一直在使用其中三个独立的迭代器

import pandas as pd
import itertools as it

filename = "C:/example.txt"
iter_a = pd.read_table(filename, iterator=True, usecols=col_list_1, chunksize=100000)
iter_b = pd.read_table(filename, iterator=True, usecols=col_list_2, chunksize=100000)
iter_c = pd.read_table(filename, iterator=True, usecols=col_list_3, chunksize=100000)

所有 usecols 列表都包含一个公共(public)标识符和其他不同的列。列名基于年份和属性,因此列列表可能如下所示:

col_list_1 = ['Key', 'A90', 'A91', 'A92']
col_list_2 = ['Key', 'B90', 'B91', 'B92']
col_list_3 = ['Key', 'C90', 'C91', 'C92']

而且我想将所有列名称更改为没有前导字符的年份,并且仅在年份上融化。

new_colnames = ['Key', '1990', '1991', '1992']
melt_values = ['1990', '1991', '1992']

for achunk, bchunk, cchunk in it.izip(iter_a, iter_b, iter_c):
achunk.columns = new_colnames
bchunk.columns = new_colnames
cchunk.columns = new_colnames

melted_a = pd.melt(achunk, id_vars='Key', value_vars=melt_values, var_name='Year', value_name='A').set_index(['Key', 'Year']).sort_index()
melted_b = pd.melt(bchunk, id_vars='Key', value_vars=melt_values, var_name='Year', value_name='B').set_index(['Key', 'Year']).sort_index()
melted_c = pd.melt(cchunk, id_vars='Key', value_vars=melt_values, var_name='Year', value_name='C').set_index(['Key', 'Year']).sort_index()

join1 = melted_a.join(melted_b, how='outer')
join2 = join1.join(melted_c, how='outer')
join2.dropna(inplace=True, how='all')

join2.to_csv('C:/output_example.txt', sep='\t')

虽然这确实有效,但需要很长时间。我在 15 秒内用 100,000 行 block 记录了一次迭代。假设它是线性扩展的,看来我正在寻找 2.25 小时的运行时间。有什么好的方法可以加快速度吗?也许使用 numpy 数组或多处理?

最佳答案

pandas csv 解析器非常快,但您可以尝试纯 python 解决方案,因为 pandas 正在做很多您并不真正关心的事情(类型推断和转换,所有连接对齐、索引等)。

这只是一个开始,但这是一个非常简单的宽到长示例。您必须对其进行测试,但我猜它可能比您在上面所做的更快。

In [30]: %%file tmp.csv
...: Key,A90,A91,A92,B90,B91,B92
...: a,1,2,3,4,5,6
...: b,7,8,9,10,11,12

In [32]: with open('tmp.csv') as f, open('out.csv', 'w') as f2:
...: f2.write('Key,Group,Year,Value\n')
...: for i, line in enumerate(f):
...: if i == 0:
...: _, *headers = line.strip().split(',')
...: headers = [(h[0], '19' + h[1:]) for h in headers]
...: else:
...: key, *rest = line.strip().split(',')
...: for (group, year), value in zip(headers, rest):
...: f2.write(','.join([key, group, year, value]) + '\n')

In [33]: print(open('out.csv').read())
Key,Group,Year,Value
a,A,1990,1
a,A,1991,2
a,A,1992,3
a,B,1990,4
a,B,1991,5
a,B,1992,6
b,A,1990,7
b,A,1991,8
b,A,1992,9
b,B,1990,10
b,B,1991,11
b,B,1992,12

关于python - 时间高效的宽到长转换 Pandas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37868453/

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