在沉重的文件上融化和交叉

时间:2015-07-28 14:12:06

标签: python pandas crosstab melt

我是Python的新手,我试图在一个非常繁重的文件(大约19,500,000行,30列)上使用交叉表函数。

以下是我尝试做的事例:

这是我的数据,减去了几个19.5百万行和30列

>>> df

    COMMUNE  DCRAN   IPONDI ACHLR 
 1    01001  01001 3.901356     3 
 2    01001  01001 3.901356     3 
 3    01001  01001 3.901356     5 
 4    01001  01001 3.901356     4 
 5    01001  01001 3.901356     4 
 6    01001  01001 3.901356     5 
 7    01002  01001 3.901356     1 
 8    01002  01001 3.901356     4 
 9    01002  01001 3.901356     4 
 10   01002  01001 3.901356     4 

这是我期望的结果:

    COMMUNE DCRAN   IPONDI ACHLR_1  ACHLR_2  ACHLR_3  ACHLR_4  ACHLR_5 
1    01001  01001 3.901356       0        0        2        2        2
2    01002  01001 3.901356       1        0        0        3        0

我已经能够使其工作500,000行,但是当我在整个文件上执行它时崩溃了。我想我的方法不是最有效的记忆方式,而且我可以使用其他功能或者更好地使用交叉表来解决这个问题,但是我被卡住了。

基本上,在使用pandas中的交叉表函数聚合行之前,我已经融化了DataFrame,尝试重现我在R上尝试做的事情。 与R相反,我可以融化整个文件(这会产生行的拖拽),但是当我执行交叉表功能时它会崩溃。

>>>
melted = pd.melt(essai_df, id_vars=['COMMUNE', 'DCRAN','IPONDI'], value_vars='ACHLR')

aggregated = pd.crosstab([melted.COMMUNE, melted.IPONDI],
               columns = [melted.variable, melted.value])

例如,通过跳过第一步,有没有办法提高内存效率? 我想过像

这样的东西
 df = pd.crosstab([df.COMMUNE, df.DCRAN, df.IPONDI], df.ACHLR)

 df

                       ACHLR    1   3   4   5
 COMMUNE    DCRAN     IPONDI                
 01001      01001   3.901356    0   2   2   2
 01002      01001   3.901356    1   0   3   0

但是,如果我添加更多变量而不仅仅是' ACHLR' - 例如' AGEMEN8' - 它返回:

                    ACHLR             1               3              4               5
                    AGEMEN8     25  40  55  65  25  40  55  65  25  40  55  65  25  40  55  65
 COMMUNE    DCRAN   IPONDI
 01001      01001   3.901356    0   0   0   0   0   0   2   0   0   2   0   0   1   0   0   1
 01002      01001   3.901356    1   0   0   0   0   0   0   0   0   3   0   0   1   0   0   1

您有什么建议来解决这个问题?

[更新]

我已经尝试过JohnE的建议,但它并没有产生显着的差异。

此外,我已经比较了直接进行交叉表的时间,然后在2,000,000行上进行熔化交叉,第二次更快。

0 个答案:

没有答案