用python加速我的数据读取?

2024-06-17 12:11:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我当前的代码如下:

import pandas as pd
import csv
import matplotlib.pyplot as plt

def data_reader(filename, rowname):
    with open(filename, newline='') as fp:
        yield from (row[1:] for row in csv.reader(fp, skipinitialspace=True)
            if row[0] == rowname)
File = 'data.csv'
ASA = pd.DataFrame.from_records(data_reader(File, 'ASA'))
GDS = pd.DataFrame.from_records(data_reader(File, 'GDS'))
SCD = pd.DataFrame.from_records(data_reader(File, 'SCD'))
ASF = pd.DataFrame.from_records(data_reader(File, 'ASF'))
ADC = pd.DataFrame.from_records(data_reader(File, 'ADC'))
DFS = pd.DataFrame.from_records(data_reader(File, 'DFS'))
DCS = pd.DataFrame.from_records(data_reader(File, 'DCS'))
DFDS = pd.DataFrame.from_records(data_reader(File, 'DFDS'))

它读取的数据如下所示:

^{pr2}$

我试图写一个IF语句,它看起来像这样:

pd.DataFrame.from_records(data_reader(
    if rowname = 'ASA'
        ASA.append(row)
    elif rowname = 'GDS'
        GDS.append(row)

等等。这样会更快吗?目前运行我的代码并绘制一个图表需要大约1分钟。我相信当我有10-15个情节要做时,时间会更长。我试过用不同的方法来写if/elseif语句,但我没有这样做的运气。在


Tags: csvfromimportdataframedataifasreader
2条回答

从磁盘读取是这里的瓶颈,所以我们应该尽量避免多次读取文件。如果您有足够的内存将整个CSV解析为一个列表dict,那么您可以使用

import csv
import collections
import pandas as pd

def data_reader(filename):
    dfs = collections.defaultdict(list)
    columns = dict()
    with open(filename, newline='') as fp:
        for row in csv.reader(fp, skipinitialspace=True):
            key = row[0].upper()
            if key == 'LEGEND':
                name = row[3]
                columns[name] = row
            else:
                dfs[key].append(row[1:])

    for key in dfs:
        num_cols = max(len(row) for row in dfs[key])
        dfs[key] = pd.DataFrame(dfs[key], columns=columns[key][-num_cols:])
    return dfs

filename = 'data.csv'
dfs = data_reader(filename)

for key in dfs:
    print(dfs[key])

循环

^{pr2}$

将CSV加载到dict,dfs。dict键是类似'ASA'的字符串, 'GDS'和{}。dict值是列表的列表。

另一个回路

for key in dfs:
    ...
    dfs[key] = pd.DataFrame(dfs[key], columns=columns[key][:-num_cols:])

将列表列表转换为数据帧。


if-statement

if key == 'LEGEND':
    name = row[3]
    columns[name] = row
else:
    dfs[key].append(row[1:])

如果该行以columns开头(大写或不大写),则在columnsdict中记录该行,否则将该行记录在dfsdict中

稍后在for-loop中:

for key in dfs:
    num_cols = max(len(row) for row in dfs[key])
    dfs[key] = pd.DataFrame(dfs[key], columns=columns[key][-num_cols:])

key是字符串,例如'ASA'。对于每个键,列数为 通过找到dfs[key]中行的最大长度获得。

columns[key]返回key对应的图例行。 columns[key][-num_cols:]返回该行中最后一个num_cols值。


data_reader返回的结果是数据帧的dict:

In [211]: dfs['ASA']
Out[211]: 
  sped  air gnd 
0  231  123   12
1  123  132   12

In [212]: dfs['GDS']
Out[212]: 
  sped air
0   12   1

In [213]: dfs['DCS']
Out[213]: 
  sped air  xds sas dac
0   13  12  123  12   4

你应该可以这样做:

df = pd.read_csv('data.csv')
ASA = df.ix[df[0] == "ASA"]
# etc ...

相关问题 更多 >