我是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行上进行熔化交叉,第二次更快。