Python 在一个沉重的文件上熔化和交叉表
我对Python相当陌生,我正试图在一个非常繁重的文件(大约19500000行,30列)上使用交叉表函数 以下是我正在尝试做的示例: 这是我拥有的数据,减去1950万行和30列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
>>> 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),如果可能的话。谢谢约翰,我会试试。关于记忆问题: