如何在块中剪切我的数据帧,但将组保持在一起

时间:2016-03-25 07:47:33

标签: python pandas

我目前拥有大量数据集。我在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。 以这种方式将数据切成块 不确定这是否有效,甚至不确定如何执行它。

2 个答案:

答案 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