Python 在一个沉重的文件上熔化和交叉表

Python 在一个沉重的文件上熔化和交叉表,python,pandas,crosstab,melt,Python,Pandas,Crosstab,Melt,我对Python相当陌生,我正试图在一个非常繁重的文件(大约19500000行,30列)上使用交叉表函数 以下是我正在尝试做的示例: 这是我拥有的数据,减去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

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

以下是我正在尝试做的示例:

这是我拥有的数据,减去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 
这就是我所期望的结果:

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

基本上,在使用pandas中的crosstab函数来聚合行之前,我已经融化了数据帧,试图重现我在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
你对解决这个问题有什么建议

[更新]

我试过约翰的建议,但没什么大不了的


此外,我还比较了直接进行交叉表运算的时间,然后在2000000行上进行交叉表运算,第二个要快得多。

我不确定交叉表的具体情况,但可以收缩数据的一件事是将变量存储为分类(‘commune’、‘dcran’)并以最小的大小存储整数(int8而不是默认的int64),如果可能的话。谢谢JohnE,我会试试。关于内存问题:我不确定交叉表是否具体,但有一件事可以收缩数据,那就是将变量存储为分类('commune','dcran'),并将整数存储为最小大小(int8而不是默认的int64),如果可能的话。谢谢约翰,我会试试。关于记忆问题: