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



我有这个数据帧:

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

在此数据帧中,(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)的列表以及用于创建新的 MultiIndex 并重新索引我的数据帧的所有L3值的列表:

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

问题是这种方法很长,数据帧很长(数百万行(。我想知道熊猫库中是否已经实现了快速方法(或者是否有更快的方法(。

通过使用unstackstack

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
u = pd.unique([t[:2] for t in df.index.values])
l2 = df.index.levels[2]
df.reindex([t + (i,) for t in u for i in l2], fill_value=0)
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

最新更新