【发布时间】:2014-08-25 20:41:45
【问题描述】:
所以,这是我的问题:
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.m 或join,因为它说merging with more than one level overlap on a multi-index is not implemented。
我发现的最直接(大声笑)的方法是:
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"]]
有什么捷径吗?
【问题讨论】:
-
我开始认为这是熊猫的一个错误。例如
dfa.loc[dfb.index]返回所有空值,但应该返回除法的值 -
如果您在 the source code 上查找我的错误消息,这似乎是有道理的(“加入 1 但不超过 1”);我想知道为什么。