Python 熊猫:管理大型csv文件:组+;在新文件中排序?

Python 熊猫:管理大型csv文件:组+;在新文件中排序?,python,pandas,csv,out-of-memory,Python,Pandas,Csv,Out Of Memory,我有一个非常大的csv文件需要管理,通过以下过程: 将文件按3列分组 对于每个组,按5列对数据帧进行排序 在csv文件中写入此数据帧 这是我的第一次尝试: file = pd.read_csv('file.csv') grouped = file.groupby([col1, col2, col3]) for key, df in grouped: name = 'key.csv' df = df.sort_values(by=[col4, col5, col6, col7

我有一个非常大的csv文件需要管理,通过以下过程:

  • 将文件按3列分组
  • 对于每个组,按5列对数据帧进行排序
  • 在csv文件中写入此数据帧
这是我的第一次尝试:

file = pd.read_csv('file.csv')
grouped = file.groupby([col1, col2, col3])
for key, df in grouped: 
    name = 'key.csv'
    df = df.sort_values(by=[col4, col5, col6, col7, col8])
    df.to_csv(name , index=False)
    yield name 
这种方法的优点是:我可以在每次迭代中生成文件名,这样就可以在不等待其他文件准备就绪的情况下继续文件的ETL过程,并且在编写csv之前直接对数据帧进行排序

缺点:文件太大,无法像那样处理,我有一个内存错误

因此,我的第二次(也是当前)尝试:

这里:没有内存问题,因为我用chunk读取文件

但是,正如您所看到的,因为如果文件退出,我会将数据附加到文件中,所以数据不会被排序。所以我需要生成所有文件的列表,并创建第二个函数:

def sort(list_files):
    for filename in list_files:
        df = pd.read_csv(filename)
        df = df.sort_value(..)
        df.to_csv(filename)
        yield filename
因此,我需要再次读取每个文件,这里的过程需要创建所有列表文件,然后才能进入ETL过程的下一步

关于这一点,你知道有没有一种方法(我目前没有看到),来解决内存错误的问题,并以更快的方式进行分组/排序? 也许(当然)这是不可能的,但任何改进都会有所帮助(如果数据已经排序,那么使用更智能的方式将数据附加到文件中?)

谢谢


编辑:也许有一种方法可以在读取大文件之前对其进行排序,但我会再次遇到内存问题,不知道是否有其他方法比pandas更好?

Dask实现了pandas的大部分功能,并且不会出现MemoryError(显然,性能不会如此出色)。 类似情况:

我曾经去过那里,我建议您使用Dask wich,它为分析提供了高级并行性,这与Spark的功能类似。然后,您可以使用与第一次尝试相同的代码

  import dask.dataframe as dd

  file = dd.read_csv('file.csv')
  grouped = file.groupby([col1, col2, col3])
  for key, df in grouped: 
      name = 'key.csv'
      df = df.sort_values(by=[col4, col5, col6, col7, col8])
      df.to_csv(name , index=False)
      yield name 
注意:如果在将文件保存到csv时出现内存错误,请使用to_csv函数中的chunksize选项

  import dask.dataframe as dd

  file = dd.read_csv('file.csv')
  grouped = file.groupby([col1, col2, col3])
  for key, df in grouped: 
      name = 'key.csv'
      df = df.sort_values(by=[col4, col5, col6, col7, col8])
      df.to_csv(name , index=False)
      yield name