使用Pandas将DataFrame转换为以非唯一列索引的Panel

1 投票
1 回答
1310 浏览
提问于 2025-04-17 10:48

下面这段代码应该可以实现我想要的功能,但在循环进行到20%的时候,它就已经占用了10GB的内存。

# In [4]: type(pd)
# Out[4]: pandas.sparse.frame.SparseDataFrame
memid = unique(pd.Member)
pan = {}
for mem in memid:
    pan[mem] = pd[pd.Member==mem]
goal = pandas.Panel(pan)

1 个回答

3

我在这里创建了一个GitHub的问题。

https://github.com/wesm/pandas/issues/663

我很确定我发现了NumPy的ndarray视图之间的循环引用,这导致了内存泄漏。我刚刚提交了一个修复:

https://github.com/wesm/pandas/commit/4c3916310a86c3e4dab6d30858a984a6f4a64103

你能从源代码安装一下,看看这个修复是否解决了你的问题吗?

顺便提一下,你可以试试使用SparsePanel代替Panel,因为Panel会把所有的子DataFrame转换成密集形式。

最后,你可以考虑使用groupby作为替代方案,而不是对SparseDataFrame进行O(N * M)的切割。这样写会更简洁:

pan = dict(pd.groupby('Member'))

撰写回答