【问题标题】:Fast way to retrieve information from huge csv file in python by column and row name按列名和行名从python中的巨大csv文件中检索信息的快速方法
【发布时间】:2019-05-06 11:43:52
【问题描述】:

我正在尝试找到一种快速且节省内存的方法来从类似于此的表格文件中检索特定数据点:

chrom:pos   04a0    7ee8    88ca    477a
chr1:925745 3   1   5   1
chr1:925746 3   1   5   1
chr1:925747 4   1   8   1
chr1:925749 4   1   5   1

在此表中,行名和列名都是唯一的。原始文件的大小为 7GB。它不会改变,因此我也可以将其转换为不同的格式,如果这样可以加快进程。 也许有一种方法可以预先生成索引?

我希望能够通过指定我感兴趣的列和行的名称来检索整数 8,例如使用函数func("chr1:925747", "88ca")

到目前为止,我已尝试在我的大文件的子集(仅 330 MB)上使用 pandas,检索信息需要 30 秒以上,这对于我的用例来说太慢了。

我的熊猫代码:

import pandas as pd
import sys

inputfile = sys.argv[1]
chrompos = sys.argv[2]
id = sys.argv[3]


data=pd.read_csv(inputfile, sep="\t", index_col=0)
result=data.at[chrompos, id]
print result

可能会使用 sql 表帮助..?我使用“.to_sql”从 pandas 数据框生成了一个 sql 表,但是我的列标题丢失了。

【问题讨论】:

  • 你的标题丢失是什么意思?他们会变成什么?
  • 只需将您的数据放入数据库中,就像您提到的那样,简单的选择以及 where 子句将使您的结果明显更快
  • @Nullman 当我用.to_sql 转换,然后运行engine.execute("SELECT * FROM test_table").fetchall(),我只会得到[(u'chr1:925745', 3, 1, 5, 1, 2, 3,...
  • 您是从一开始还是从 data.at 开始计时这 30 秒?如果您要进行多次检索,它们应该只从 data.at 中计时。使用此方法读取 7Gb 数据不起作用
  • @aws_apprentice 也许你是对的,我应该试一试。我太喜欢我的 python 解决方案了,没有考虑先生成一个数据库并测试它有多快。

标签: python pandas tabular


【解决方案1】:

您可以使用比 pandas 读取数据更快的数据表,但数据表中的所有功能都不能在 pandas 中使用

import datatable as dt
dt_df = dt.fread("../input/loan.csv")

但看完后你可以把它转换成熊猫

   dt_df.to_pandas()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    • 2019-01-21
    • 1970-01-01
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    相关资源
    最近更新 更多