在重fi上熔化和交叉

2024-10-03 06:21:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Python相当陌生,我正试图在一个非常重的文件(大约19500000行,30列)上使用crosstab函数。在

下面是我要做的示例:

这是我的数据,减去1950万行和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 

这就是我预期的结果:

^{pr2}$

我已经能够使它工作500000行,但当我对整个文件执行此操作时,它崩溃了。我想我的方法在内存方面不是最有效的,我可以使用其他函数或者更好地使用交叉表来解决这个问题,但是我被卡住了。在

基本上,在使用pandas中的crosstab函数聚合行之前,我已经融化了数据帧,试图重现我在R上所做的事情。 与R相反,我可以融化整个文件(这会造成行数的减少),但当我执行交叉表函数时,它会崩溃。在

^{3}$

有没有一种方法可以更有效地利用内存,比如跳过第一步? 我想了些什么

 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

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

[更新]

我试过约翰的建议,但没起到显著的作用。在

此外,我还比较了直接做交叉表的时间,以及在2000000条线上熔化然后交叉条的时间,第二个要快得多。在


Tags: 文件数据方法函数内存df时间交叉