在 Python Pandas 中创建大型 MultiIndex(1000 万行)的问题用于重新索引大型 DataFrame
Problems with creating large MultiIndex (10 million rows) in Python Pandas used to reindex large DataFrame
我的情况是我有一个带有 MultiIndex 的 DataFrame,包括 TimeStamp
和数字(波长从 280-4000 nm),其中波长数间距从每 1 nm 到 5 nm 变化。我需要 1 nm 间距并计划在重新索引我的 DataFrame 后进行线性插值。
我尝试使用 pd.MultiIndex.from_product()
创建一个 MultiIndex
并提供两个列表,每个列表的长度约为 4000 项,这导致 Python 耗尽了我计算机的所有 RAM。代码如下:
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()
或者它不能处理被传递的大列表?
- 我的解决方法有效还是我掉进了陷阱?
感谢您的帮助!
这应该不是问题。您需要更具体地说明 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
我的情况是我有一个带有 MultiIndex 的 DataFrame,包括 TimeStamp
和数字(波长从 280-4000 nm),其中波长数间距从每 1 nm 到 5 nm 变化。我需要 1 nm 间距并计划在重新索引我的 DataFrame 后进行线性插值。
我尝试使用 pd.MultiIndex.from_product()
创建一个 MultiIndex
并提供两个列表,每个列表的长度约为 4000 项,这导致 Python 耗尽了我计算机的所有 RAM。代码如下:
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()
或者它不能处理被传递的大列表? - 我的解决方法有效还是我掉进了陷阱?
感谢您的帮助!
这应该不是问题。您需要更具体地说明 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