我有一个大型的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)
我希望我的问题不那么混乱
答案 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)
完全一样。 iterator
和chunksize=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位。)iterator
和chunksize
如何解决问题:允许您在需要时进行权衡。
答案 2 :(得分:4)
你需要连接夹头。例如:
df2 = pd.concat([chunk for chunk in df])
然后在df2