我有一个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)
有更快的方法吗?
Filter out rows from CSV before loading to pandas dataframe提供了一个有趣的解决方案,但不幸的是,我要细分的列不在第一列中。
编辑:
我纯粹需要将csv文件拆分为每个日期。生成的csv文件将传递给另一个团队。我需要所有列,我不想更改任何数据,我不需要执行任何groupby。
答案 0 :(得分:0)
主要问题是将整个数据集读取到内存中。通常,对于非常大的文件,我需要逐行读取文件,因为它不适合内存。因此,我拆分了文件,然后才可以使用部件(使用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:])