用熊猫加载许多CSV

时间:2020-02-11 02:36:22

标签: python database pandas

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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秒的时间内访问数据。问我是否需要其他帮助。我很乐意指导您。