我目前拥有大量数据集。我在2000年的每年都有一套。我花了三年的时间组合并运行一个代码来清理。 问题在于,由于我的内存耗尽,我无法在其上运行我的清洁代码。 我正在考虑使用以下内容来分割数据:
df.ix[1,N/x]
其中N是我的数据框中的总行数。我想我应该替换数据帧以清除正在使用的内存。这意味着我必须首先为我创建的每个块加载数据帧。
有几个问题: 当N每年不同时,我如何获得N? 该操作要求数据组保持在一起。 有没有办法让x随N的大小而变化?
所有这些都非常低效/是否有一个有效的内置功能呢?
Dataframe看起来像:
ID Location year other variables
1 a 2006
1 a 2007
1 b 2006
1 a 2005
2 c 2005
2 c 2007
3 d 2005
我需要的是让所有相同的ID保持在一起。 要以可管理的块的形式切割的数据,取决于每年更改的数据总量。 在这种情况下,它将是:
ID Location year other variables
1 a 2006
1 a 2007
1 b 2006
1 a 2005
ID Location year other variables
2 c 2005
2 c 2007
3 d 2005
数据源自年份的csv。所有2005年的数据来自2005csv,2006年数据来自2006csv等。 将csv加载到内存中并连接起来形成一组三年。 各个csv文件具有与上面指出的相同的设置。所以每个观察结果都用ID,位置和年份表示,然后是许多其他变量。
仅按群组运行它将是一个坏主意,因为这些ID有数千甚至数百万。他们可以有几十个地点,最多三年。所有这些都需要保持在一起。
根据我的经验,这么多行的循环需要很长时间
我想的可能是: 创建一个计算组数的变量 使用此计数变量的最大值并将其除以4或5。 以这种方式将数据切成块 不确定这是否有效,甚至不确定如何执行它。
答案 0 :(得分:2)
通过导入Blaze使用chunked pandas。 来自http://blaze.readthedocs.org/en/latest/ooc.html
的说明在大文件上调用时,天真地使用Blaze会自动触发核心外系统。
d = Data('my-small-file.csv')
d.my_column.count() # Uses Pandas
d = Data('my-large-file.csv')
d.my_column.count() # Uses Chunked Pandas
它是如何运作的? Blaze将数据资源分解为一系列块。它将一个块拉入内存,对其进行操作,拉入下一个等等。在处理完所有块之后,它通常必须使用中间结果上的另一个操作来完成计算。
答案 1 :(得分:1)
实现这一目标的一种方法如下:
import pandas as pd
# generating random DF
num_rows = 100
locs = list('abcdefghijklmno')
df = pd.DataFrame(
{'id': np.random.randint(1, 100, num_rows),
'location': np.random.choice(locs, num_rows),
'year': np.random.randint(2005, 2007, num_rows)})
df.sort_values('id', inplace=True)
print('**** sorted DF (first 10 rows) ****')
print(df.head(10))
# chopping DF into chunks ...
chunk_size = 5
chunks = [i for i in df.id.unique()[::chunk_size]]
chunk_margins = [(chunks[i-1],chunks[i]) for i in range(1, len(chunks))]
df_chunks = [df.ix[(df.id >= x[0]) & (df.id < x[1])] for x in chunk_margins]
print('**** first chunk ****')
print(df_chunks[0])
输出:
**** sorted DF (first 10 rows) ****
id location year
31 2 c 2005
85 2 e 2006
89 2 l 2006
70 2 i 2005
60 4 n 2005
68 7 g 2005
22 7 e 2006
73 10 i 2005
23 10 j 2006
47 16 n 2005
**** first chunk ****
id location year
31 2 c 2005
85 2 e 2006
89 2 l 2006
70 2 i 2005
60 4 n 2005
68 7 g 2005
22 7 e 2006
73 10 i 2005
23 10 j 2006
47 16 n 2005
6 16 k 2006
82 16 g 2005