首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用反向判据高效读取DataFrame文件

用反向判据高效读取DataFrame文件
EN

Stack Overflow用户
提问于 2021-09-24 11:17:46
回答 2查看 38关注 0票数 0

我有一堆20MB的文本文件,结构是这样的:

代码语言:javascript
复制
{'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]}
...

每行中的记录行数各不相同。

我想这样理解:

代码语言:javascript
复制
        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

我已经准备好了这样的代码,它工作得很好:

代码语言:javascript
复制
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)完全优化它。

这个函数已经在线程中运行了,所以多线程/处理不是一个好主意。

EN

回答 2

Stack Overflow用户

发布于 2021-09-24 13:02:25

你能试试下面的代码吗:

代码语言:javascript
复制
v = {k: v for k, v in zip(d.keys(), t)} for t in zip(*d.values())]
return v
票数 0
EN

Stack Overflow用户

发布于 2021-09-24 13:43:32

首先,我会尽量避免使用readlines,它会将整个文件作为行列表加载到内存中。然后,我会尝试向Dataframe构造函数提供一个列表字典:

代码语言:javascript
复制
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)

不确定它是否很快,但至少它很简单

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69314140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档