首页 > 解决方案 > 使用 Pandas 加载许多 CSV

问题描述

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

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

标签: pythondatabasepandas

解决方案


简单的解决方案。去下载用于 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 秒的时间内访问数据。问我,如果您需要任何其他帮助。我很乐意为您提供指导。


推荐阅读