python - 如何有效地重新索引 DataFrame 以填补索引列表中的漏洞?
问题描述
我有这个数据框:
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
推荐阅读
- toit - 如何在 Toit 中生成随机数?
- angular - 我可以像这样链接可观察对象吗?我实现了一些东西,但不确定这是最好的方法吗?
- data-structures - 需要多少探针才能避免散列冲突?
- sql - 从上一行更新记录
- javascript - 列表/手风琴在按钮上方的定位?(语义用户界面)
- cmake - 如何通过使用特殊参数调用 cmake 来更改 CMakeLists.txt 中的选项
- jitsi - JITSI 视频会议 - 当主持人/主持人离开会议时,是否有任何配置或 API 可以踢出所有参与者?
- php - Domdocument:为什么 XSLT 转换输出变成单行?
- arm - gem5 完整系统 Linux 启动失败并显示“内核恐慌 - 未同步:VFS:无法挂载根 fs”
- html - 如何将此菜单分成两列?