Skip to main content
 首页 » 编程设计

python之如何有效地重新索引 DataFrame 以填补索引列表中的漏洞

2025年05月04日14Terrylee

我有这个数据框:

          value 
L1 L2 L3        
11 21 31      1 
      32      2 
      34      3 
   23 31      4 
      33      5 
      34      6 
12 21 32      7 

在这个 DataFrame 中,(L1, L2) 是一个 ID 元组,L3 是一个周数。我想在我的 DataFrame 中添加一些行,以便为所有具有默认值的元组提供所有可能的周数:

          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 

为了得到这个 DataFrame,我得到了唯一元组 (L1,L2) 的列表和 L3 的所有值的列表来创建一个新的MultiIndex 并重新索引我的 DataFrame:

# 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) 

问题是这个方法是一个非常长的大 DataFrame(数百万行)。我想知道 pandas 库中是否已经实现了快速方法(或者是否有更快的方法)。

请您参考如下方法:

通过使用unstack 和stack

df.unstack().stack(dropna=False).fillna(0).astype(int) 
Out[433]:  
          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