在Python Pandas中创建大型MultiIndex(1000万行)的问题用于重新索引大型DataFrame

时间:2015-04-01 16:59:04

标签: python pandas multi-index

我的情况是我有一个带有MultiIndex的DataFrame,包括TimeStamp和数字(波长从280到4000 nm),其中波长数间距从每1 nm变化到5 nm。我需要1 nm间距并计划并计划在重新索引我的DataFrame后进行线性插值。

我尝试使用MultiIndex创建pd.MultiIndex.from_product()并提供两个长度约为4000项的列表,这些列表导致Python耗尽了我所有的计算机内存。代码如下:

mindex = pd.MultiIndex.from_product([times_list, waves_list],
                        names=['TmStamp', 'Wvlgth']
                                   )

from_product()是一个简单的功能,所以我不认为我搞砸了它,但我认为它能够处理比我通过它更大的列表。

为了试图解决这个问题,我使用了pd.MultiIndex()并传递了唯一的级别,与.from_product()传递的内容相同,但使用下面的代码为每个级别构建了标签:

times = Series(df.index.get_level_values('TmStamp').values).unique()
times_Series = Series(times)
times_label_list = list()
counter = 0
for i in times_Series:
    temp_list = Series([counter] * 3721)
    times_label_list.append(temp_list)
    counter +=1 
times_label = pd.concat(times_label_list)

waves_levels = np.arange(280,4001,1).tolist()
waves_label = np.arange(0,3721,1).tolist() * times_count

中使用的

midx = pd.MultiIndex([times_list, waves_levels],
                  labels=[times_label, waves_label],
                  names=['TmStamp','Wvlng']
                 )

并且MultiIndex用于重新索引我的df

ri_df = df.reindex(midx)

我的问题是:

  • 我搞砸了pd.MultiIndex.from_product()还是不能处理通过大型名单?
  • 我的解决方法是有效还是我陷入任何陷阱?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

这应该不是问题。你需要更具体地说明times_list实际上是什么。

In [2]: mi = pd.MultiIndex.from_product([pd.date_range('20130101',freq='s',periods=4000),
   ...:                                  np.arange(280,4000)],names=['times','wl'])

In [4]: mi.nbytes/(1024*1024.0)
Out[4]: 56.82167148590088

In [6]: len(mi)
Out[6]: 14880000