我有一堆20MB的文本文件,结构是这样的:
{'col-1': ['data-11', 'data-12'], 'col-2': [1, 2], 'col-n': [1, 2]}
{'col-1': ['data-21', 'data-22'], 'col-2': [1, 2], 'col-n': [1, 2]}
{'col-1': ['data-31', 'data-32', 'data-33'], 'col-2': [1, 2, 3], 'col-n': [1, 2, 3]}
...每行中的记录行数各不相同。
我想这样理解:
col-1 col-2 col-n
0 data-11 1 1
1 data-12 2 2
2 data-21 1 1
3 data-22 2 2
4 data-31 1 1
5 data-32 2 2
6 data-33 3 3我已经准备好了这样的代码,它工作得很好:
import ast
import pandas as pd
import itertools
def _eval(line: str):
''' Turns: {'col-1': ['data-11', 'data-12'], 'col-2': [1, 2], 'col-n': [1, 2]}
Into: [{'col-1': 'data-11', 'col-2': 1, 'col-n': 1}, {'col-1': 'data-12', 'col-2': 2, 'col-n': 2}]
'''
try:
v = ast.literal_eval(line.rstrip()) # Reads line to dict
v = [{k: v[k][i] for k in v} for i in range(len(v['col-n']))] # Revers dict, by splitting them and rejoin
return v
# In case of file structure error
except Exception as e:
print('err', e)
return []
def read_structure(fp):
with open(fp) as fh:
return pd.DataFrame(itertools.chain(*list(map(_eval, fh.readlines()))))但肯定有更好的办法。使用itertools和map,我已经得到了不到5秒的时间。
我想:
A)优化循环力矩v = [{k: v[k][i] for k in v} for i in range(len(v['col-n']))]
B)知道是否已经有pandas方法可以读取这样的结构(我已经搜索并尝试了所有read_dict方法,并记录了具有不同参数的方法)
C)完全优化它。
这个函数已经在线程中运行了,所以多线程/处理不是一个好主意。
发布于 2021-09-24 13:02:25
你能试试下面的代码吗:
v = {k: v for k, v in zip(d.keys(), t)} for t in zip(*d.values())]
return v发布于 2021-09-24 13:43:32
首先,我会尽量避免使用readlines,它会将整个文件作为行列表加载到内存中。然后,我会尝试向Dataframe构造函数提供一个列表字典:
def read_structure(fp):
cols = 'col-1', 'col-2', 'col-n' # declare the column names
data = {col: [] for col in cols} # initialize the data structure
with open(fp) as fh:
for i, line in enumerate(io.StringIO(t), 1):
try:
row = ast.literal_eval(line)
for k, v in row.items():
data[k].extend(v)
except Exception as e:
print('Error line', i, line, e)
raise # unsure that we can continue after an error
return pd.DataFrame(data)不确定它是否很快,但至少它很简单
https://stackoverflow.com/questions/69314140
复制相似问题