gpt4 book ai didi

python - Pandas 部分加入多索引

转载 作者:太空狗 更新时间:2023-10-29 19:25:31 25 4
gpt4 key购买 nike

所以,这是我的问题:

dfa = pd.DataFrame({"a": [["a", "b", "c"][int(k/10)] for k in range(30)],
"b": ["a" + repr([10, 20, 30, 40, 50, 60][int(k/5)]) for k in range(30)],
"c": np.arange(30),
"d": np.random.normal(size=30)}).set_index(["a","b","c"])
dfb = pd.DataFrame({"a": [["a", "b", "c"][int(k/2)] for k in range(6)],
"b": ["a" + repr([10, 20, 30, 40, 50, 60][k]) for k in range(6)],
"m": np.random.normal(size=6)**2}).set_index(["a","b"])

基本上我有两个具有多索引的数据帧,我想将 dfa.d 除以 dfb.m,加入 ("a", "b")。我不能天真地做 dfa.d/dfb.mjoin 因为它说 在多索引上合并超过一个级别的重叠不是已实现

我发现最直接(哈哈)的方法是:

dfc = dfa.reset_index().set_index(["a", "b"]).join(dfb)
dfc["r"] = dfc.d / dfc.m
dfd = dfc.reset_index().set_index(["a", "b", "c"])[["r"]]

有什么捷径吗?

最佳答案

an open bug对于这个问题,当前的里程碑是 0.15.1

在出现更好的东西之前,有 a workaround涉及以下步骤:

  • 通过unstack将它们放入列中来排除不匹配的索引级别
  • 执行乘法/除法
  • 将列堆叠到它们原来的位置。

像这样:

In [109]: dfa.unstack('c').mul(dfb.squeeze(), axis=0).stack('c')
Out[109]:
d
a b c
a a10 0 1.535221
1 -2.151894
2 1.986061
3 -1.946031
4 -4.868800
a20 5 -2.278917
6 -1.535684
7 2.289102
8 -0.442284
9 -0.547209
b a30 10 -12.568426
11 7.180348
12 1.584510
13 3.419332
14 -3.011810
a40 15 -0.367091
16 4.264955
17 2.410733
18 0.030926
19 1.219653
c a50 20 0.110586
21 -0.430263
22 0.350308
23 1.101523
24 -1.371180
a60 25 -0.003683
26 0.069884
27 0.206635
28 0.356708
29 0.111380

注意两件事:

  1. dfb 必须是一个 Series,否则关于将 dfb 的哪些列用于乘法会导致额外的复杂性。您可以将 dfb.squeeze() 替换为 dfb['m']
  2. 如果不匹配的索引不是三个索引中的最后一个,则不会保留索引级别的顺序。在这种情况下,执行 what @jreback suggests然后重新排序索引级别:.reorder_levels(dfa.index.names)

关于python - Pandas 部分加入多索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25494065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com