为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

开满天机 2021-09-11 13:31:53
我有一个 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。
查看完整描述

1 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

主要问题是将整个数据集读入内存。通常,对于一个非常大的文件,我需要逐行读取文件,因为它不适合内存。因此,我拆分了文件,然后才能处理各个部分(使用 Python/pandas、R 或 Stata,它们都将整个数据集加载到内存中)。


要拆分文件,我会从头开始编写一个 CSV 阅读器。如果您不必处理带引号的字符串中的分隔符,那就不太难了(否则使用regex并不会更难)。使用内置csv模块可能用更少的代码(我承认我从未使用过它)。


下面根据变量的值拆分文件。也可以调整代码以固定行数拆分,过滤,添加或删除变量......


import sys


def 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:])


查看完整回答
反对 回复 2021-09-11
  • 1 回答
  • 0 关注
  • 238 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信