在日期列上拆分 Pandas 中庞大数据集的最快方法

我有一个 1400 万行的 CSV 文件,其中有一个日期列(不是第一列),我想用它来过滤和拆分数据。


目前,我正在将其加载到 Pandas 数据框中来执行此操作:


df = pd.read_csv(filepath, dtype=str) 


for date in df['dates'].unique():

    subset = df[df['dates'] == date]

    subset.to_csv(date + dest_path)

有没有更快的方法来做到这一点?


在加载到 Pandas 数据帧之前从 CSV 中过滤掉行提供了一个有趣的解决方案,但不幸的是我要拆分的列不在第一列中。


编辑:


我纯粹需要将 csv 文件拆分为每个日期。生成的 csv 文件将传递给另一个团队。我需要所有的列,我不想更改任何数据,我不需要做任何 groupby。


开满天机
浏览 239回答 1
1回答

繁星coding

主要问题是将整个数据集读入内存。通常,对于一个非常大的文件,我需要逐行读取文件,因为它不适合内存。因此,我拆分了文件,然后才能处理各个部分(使用 Python/pandas、R 或 Stata,它们都将整个数据集加载到内存中)。要拆分文件,我会从头开始编写一个 CSV 阅读器。如果您不必处理带引号的字符串中的分隔符,那就不太难了(否则使用regex并不会更难)。使用内置csv模块可能用更少的代码(我承认我从未使用过它)。下面根据变量的值拆分文件。也可以调整代码以固定行数拆分,过滤,添加或删除变量......import sysdef main(arg):    if len(arg) != 3:        print("csvsplit infile outfile variable")        return    input_name = arg[0]    output_name = arg[1]    split_var = arg[2]    sep = ","    outfiles = {}    with open(input_name) as f:        var = f.readline().rstrip("\r\n").split(sep)        ivar = {name: i for i, name in enumerate(var)}        ikey = ivar[split_var]        for line in f:            v = line.rstrip("\r\n").split(sep)            key = v[ikey]            if key not in outfiles:                outfiles[key] = open("%s_%s.csv" % (output_name, key), "wt")                outfiles[key].write(sep.join(var) + "\n")            outfiles[key].write(line)    for key, outfile in outfiles.items():        outfile.close()main(sys.argv[1:])
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python