我最近在处理一个大型数据框和其相关的多重索引时遇到了问题。下面这个简化的例子将展示这个问题。
import pandas as pd
import numpy as np
np.random.seed(1)
idx = pd.MultiIndex.from_product([['A','B'],[5,6]])
df = pd.DataFrame(data= np.random.randint(1,100,(4)),index= idx,columns =['P'])
print df
这将产生:
P
A 5 38
6 13
B 5 73
6 10
现在快速查看索引。
print df.index
MultiIndex(levels=[[u'A', u'B'], [5, 6]],
labels=[[0, 0, 1, 1], [0, 1, 0, 1]])
如果我切分这个数据框,我会注意到多重索引永远不会压缩。即使进行了深度复制。
在切片操作中,减少索引的内存占用的最佳方法是什么?
df_slice = df[df['P']>20]
print df_slice
print df_slice.index
P
A 5 38
B 5 73
看一下数据框(dataframe)如何减少,但是索引没有改变。
MultiIndex(levels=[[u'A', u'B'], [5, 6]],
labels=[[0, 1], [0, 0]])
即使使用 .copy(deep=True)
df_slice = df[df['P']>20].copy(deep=True)
print df_slice.index
MultiIndex(levels=[[u'A', u'B'], [5, 6]]
,labels=[[0, 1], [0, 0]])
我原本期望MultiIndex将6移除,如下所示:
MultiIndex(levels=[[u'A', u'B'], [5]]
,labels=[[0, 1], [0, 0]])
问题出现在实践中的数据框架很大时。