python - 使用大型csv的pandas结构(迭代和chunksize)

时间:2015-11-11 01:48:32

标签: python csv pandas dataframe bigdata

我有一个大型的csv文件,大约600mb,有1100万行,我想创建像枢轴,直方图,图形等统计数据。显然只是想正常阅读:

def Red(self, request, queryset):
        queryset.update(colour=Colour.objects.get(colour_name__iexact='Red'), updated=timezone.now())

不起作用所以我在类似的帖子中找到了迭代和chunksize所以我用了

def Red(self, request, queryset):
    queryset.update = self.model._meta.app_label, self.model._meta.model_name

一切都很好,我可以举例df = pd.read_csv('Check400_900.csv', sep='\t') 并用

搜索整个文件
df = pd.read_csv('Check1_900.csv', sep='\t', iterator=True, chunksize=1000)

我的问题是我不知道如何在整个df中使用如下所示的内容而不仅仅是一个块

print df.get_chunk(5)

我希望我的问题不那么混乱

3 个答案:

答案 0 :(得分:21)

解决方案,如果需要创建一个大的DataFrame,如果需要一次处理所有数据(可能的,但不是recommended):

然后使用concat对所有块进行df,因为函数的输出类型:

df = pd.read_csv('Check1_900.csv', sep='\t', iterator=True, chunksize=1000)

不是数据框,但是pandas.io.parsers.TextFileReader - source

tp = pd.read_csv('Check1_900.csv', sep='\t', iterator=True, chunksize=1000)
print tp
#<pandas.io.parsers.TextFileReader object at 0x00000000150E0048>
df = pd.concat(tp, ignore_index=True)

我认为有必要为函数concat添加参数ignore index,因为避免了索引的重复性。

编辑:

但是如果想要使用聚合等大数据,那么使用dask要好得多,因为它提供了高级并行性。

答案 1 :(得分:7)

此处需要concat。这与写sum(map(list, grouper(tup, 1000)))而不是list(tup)完全一样。 iteratorchunksize=1000唯一的作用是为您提供一个读取器对象,该对象可以迭代1000行DataFrame而不是读取整个内容。如果您想要一次性完成整个过程,请不要使用这些参数。

但是如果一次将整个文件读入内存太昂贵(例如,需要大量内存才能获得MemoryError,或者通过将系统放入交换地狱来减慢系统爬行速度),&# 39;正是chunksize的用途。

问题是您将结果迭代器命名为df,然后尝试将其用作DataFrame。它不是DataFrame;它是一个迭代器,可以逐个为您提供1000行的DataFrame。

当你这样说时:

  

我的问题是我不知道如何在整个df中使用如下所示的内容而不仅仅是一个块

答案是你无法。如果您无法将整个内容加载到一个巨大的DataFrame中,则无法使用一个巨大的DataFrame。你必须围绕块重写你的代码。

而不是:

df = pd.read_csv('Check1_900.csv', sep='\t', iterator=True, chunksize=1000)
print df.dtypes
customer_group3 = df.groupby('UserID')

......你必须做这样的事情:

for df in pd.read_csv('Check1_900.csv', sep='\t', iterator=True, chunksize=1000):
    print df.dtypes
    customer_group3 = df.groupby('UserID')

通常,您需要做的是聚合一些数据 - 将每个块减少到只有您需要的部分更小的东西。例如,如果要按组对整个文件求和,则可以groupby每个块,然后按组对块进行求和,并存储每个组的运行总计的序列/数组/列表/字典。

当然,它比仅仅一次总结一个巨大的系列更复杂,但是没有办法解决这个问题。 (除了购买更多RAM和/或切换到64位。)iteratorchunksize如何解决问题:允许您在需要时进行权衡。

答案 2 :(得分:4)

你需要连接夹头。例如:

df2 = pd.concat([chunk for chunk in df])

然后在df2

上运行您的命令