Python 如何有效地重新索引数据帧以填补索引列表中的漏洞?

Python 如何有效地重新索引数据帧以填补索引列表中的漏洞?,python,pandas,dataframe,optimization,Python,Pandas,Dataframe,Optimization,我有这个数据框: value L1 L2 L3 11 21 31 1 32 2 34 3 23 31 4 33 5 34 6 12 21 32 7 # Get all tuples (L1,L2) l12_set = set(df.index.droplevel(2).tolist()) # Get all L3 l3_set = se

我有这个数据框:

          value
L1 L2 L3       
11 21 31      1
      32      2
      34      3
   23 31      4
      33      5
      34      6
12 21 32      7
# Get all tuples (L1,L2)
l12_set = set(df.index.droplevel(2).tolist())

# Get all L3
l3_set = set(df.index.droplevel([0,1]).tolist())

index_array_l1 = np.array([], int)
index_array_l2 = np.array([], int)
index_array_l3 = np.array([], int)

# Creation of the index
for l1, l2 in l12_set:
    for l3 in l3_set:
        index_array_l1 = np.append(index_array_l1, l1)
        index_array_l2 = np.append(index_array_l2, l2)
        index_array_l3 = np.append(index_array_l3, l3)

index_array = np.array([index_array_l1, index_array_l2, index_array_l3])
multi_index = pd.MultiIndex.from_arrays(index_array, names=['L1', 'L2', 'L3'])

df = df.reindex(multi_index, fill_value=0)
在这个数据帧中,L1,L2是ID的元组,L3是周数。我想在我的数据框中添加一些行,以使所有元组的所有可能周数都具有默认值:

          value
L1 L2 L3       
11 21 31      1
      32      2
      33      0
      34      3
   23 31      4
      32      0
      33      5
      34      6
12 21 31      0
      32      7
      33      0
      34      0
为了得到这个数据帧,我得到了唯一元组L1、L2的列表和L3的所有值的列表,以创建一个新的多索引并重新索引我的数据帧:

          value
L1 L2 L3       
11 21 31      1
      32      2
      34      3
   23 31      4
      33      5
      34      6
12 21 32      7
# Get all tuples (L1,L2)
l12_set = set(df.index.droplevel(2).tolist())

# Get all L3
l3_set = set(df.index.droplevel([0,1]).tolist())

index_array_l1 = np.array([], int)
index_array_l2 = np.array([], int)
index_array_l3 = np.array([], int)

# Creation of the index
for l1, l2 in l12_set:
    for l3 in l3_set:
        index_array_l1 = np.append(index_array_l1, l1)
        index_array_l2 = np.append(index_array_l2, l2)
        index_array_l3 = np.append(index_array_l3, l3)

index_array = np.array([index_array_l1, index_array_l2, index_array_l3])
multi_index = pd.MultiIndex.from_arrays(index_array, names=['L1', 'L2', 'L3'])

df = df.reindex(multi_index, fill_value=0)
问题是这种方法非常长,需要数百万行的大型数据帧。我想知道pandas库中是否已经实现了快速方法,或者是否有更快的方法。

使用unstack和stack

通过使用unstack和stack


df.unstackfill\u value=0.stackdropna=false实际上,我忘了。如果使用fill\u value=0,则不需要dropna=False。df.unstackfill\u value=0.stackdf.unstackfill\u value=0.stackdropna=false实际上,我忘了。如果使用fill\u value=0,则不需要dropna=False。df.unstackfill_值=0。stack@jezrael修复。@jezrael修复。