【问题标题】:Loading many CSVs with Pandas使用 Pandas 加载许多 CSV
【发布时间】:2020-02-11 11:16:15
【问题描述】:

我的硬盘上存储了 3000 个 CSV 文件,每个文件包含数千行和 10 列。行对应于日期,并且行数以及确切日期在电子表格中是不同的。所有电子表格的列的编号 (10) 和标签都相同。对于从所有电子表格中的最早日期到所有电子表格中的最新日期的每个日期,我需要 (i) 访问每个电子表格中存在该日期数据的列,(ii) 运行一些计算,以及 (iii) 存储该日期的结果(一组 3 或 4 个标量值)。澄清一下,results 应该是我工作区中的一个变量,用于存储所有 CSV 的每个日期的结果。

有没有一种方法可以使用 Python 加载这些数据,既节省时间又节省内存?我尝试为每个 CSV 创建一个 Pandas 数据框,但是将所有数据加载到 RAM 中需要将近十分钟,并且几乎完全填满了我的 RAM。是否可以检查给定 CSV 中是否存在日期,如果存在,则将与该 CSV 对应的列加载到单个数据框中?这样,我可以只从每个 CSV 加载我需要的行来进行计算。

【问题讨论】:

  • 如果内存不足,可能是时候考虑使用数据库而不是 RAM。
  • Pandas 确实提供了一些减少内存使用的选项,您尝试过其中的任何一个吗?还有一些与 Pandas 类似(或与之集成)的工具,旨在处理大量数据。

标签: python database pandas


【解决方案1】:

简单的解决方案。 去下载用于 SQlite 的数据库浏览器。 打开它,然后创建新数据库。 之后,从 CSV 转到文件和导入表。 (对所有 CSV 表执行此操作)或者,您可以使用 Python 脚本和 sqlite3 库快速自动化地创建表并从 CSV 表插入值。

导入所有表格后,根据您的详细信息使用此功能。

import sqlite3
import pandas as pd

data = pd.read_csv("my_CSV_file.csv")           # Your CSV Data Path
def create_database():                          # Create Database with table name
    con = sqlite3.connect('database.db')
    cur = con.cursor()
    cur.execute("CREATE TABLE IF NOT EXISTS my_CSV_data (id INTEGER PRIMARY KEY,  name text, address text,mobile text , phone text,balance float,max_balance INTEGER)")
    con.commit()
    con.close()

def insert_into_company():                      # Inserting data into column
    con = sqlite3.connect(connection_str)
    cur = con.cursor()
    for i in data:
        cur.execute("INSERT INTO my_CSV_data VALUES(Null,?,?,?,?,?,?)",(i[0],i[1],i[2],i[3],i[4],i[5]))
    con.commit()
    con.close()

def select_company():                           # Viewing Data from Column
    con = sqlite3.connect(connection_str)
    cur = con.cursor()
    cur.execute("SELECT * FROM my_CSV_data")
    data = cur.fetchall()
    con.close()
    return data

create_database()
insert_into_company()
for j in select_company():
    print(j)

这样做一次,您可以一次又一次地使用它。它将使您能够在不到 1 秒的时间内访问数据。问我,如果您需要任何其他帮助。我很乐意为您提供指导。

【讨论】:

  • 谢谢!我以前从未使用过合适的数据库,昨天刚开始使用sqlite3。我已经成功地将我的表加载到我的数据库中,并看到了将数据保存在数据库中的好处,因为我在进行计算时不必将整个数据库加载到 RAM 中。相反,我可以从需要进行计算的表中提取行和列。
  • 我确实有一个后续问题,想知道您是否可以提供帮助。我已经发布了here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-18
  • 2019-01-31
  • 1970-01-01
  • 2019-07-25
  • 2017-10-08
  • 2021-10-09
  • 1970-01-01
相关资源
最近更新 更多