pandas 部分级别的多索引交集
pandas MultiIndex intersection on partial levels
假设我有两个具有多索引的数据帧,其中一个索引比另一个更深。现在我只想 select 来自一个(更深的)数据帧的那些行,其中它们的部分索引包含在另一个数据帧中。
示例输入:
df = pandas.DataFrame(
{
"A": ["a1", "a1", "a1", "a2", "a2", "a2"],
"B": ["b1", "b1", "b2", "b1", "b2", "b2"],
"C": ["c1", "c2", "c1", "c1", "c1", "c2"],
"V": [1, 2, 3, 4, 5, 6],
}
).set_index(["A", "B", "C"])
df2 = pandas.DataFrame(
{
"A": ["a1", "a1", "a2", "a2"],
"B": ["b1", "b3", "b1", "b3"],
"X": [1, 2, 3, 4]
}
).set_index(["A", "B"])
视觉:
V
A B C
a1 b1 c1 1
c2 2
b2 c1 3
a2 b1 c1 4
b2 c1 5
c2 6
X
A B
a1 b1 1
b3 2
a2 b1 3
b3 4
期望的输出:
result = pandas.DataFrame(
{
"A": ["a1", "a1", "a2"],
"B": ["b1", "b1", "b1"],
"C": ["c1", "c2", "c1"],
"V": [1, 2, 4],
}
).set_index(["A", "B", "C"])
视觉:
V
A B C
a1 b1 c1 1
c2 2
a2 b1 c1 4
我试过了
df.loc[df2.index]
和 df.loc[df.index.intersection(df2.index)]
但这不起作用。
我想我可以做 df.join(df2, how="inner")
然后删除所有添加的 df2
列,但这很麻烦。或者有没有办法去掉 df2
的所有列?
如有任何帮助,我将不胜感激。
一种选择是在两者共有的特定标签上使用 isin
,并使用生成的布尔值过滤 df
:
df.loc[df.index.droplevel('C').isin(df2.index)]
V
A B C
a1 b1 c1 1
c2 2
a2 b1 c1 4
假设我有两个具有多索引的数据帧,其中一个索引比另一个更深。现在我只想 select 来自一个(更深的)数据帧的那些行,其中它们的部分索引包含在另一个数据帧中。
示例输入:
df = pandas.DataFrame(
{
"A": ["a1", "a1", "a1", "a2", "a2", "a2"],
"B": ["b1", "b1", "b2", "b1", "b2", "b2"],
"C": ["c1", "c2", "c1", "c1", "c1", "c2"],
"V": [1, 2, 3, 4, 5, 6],
}
).set_index(["A", "B", "C"])
df2 = pandas.DataFrame(
{
"A": ["a1", "a1", "a2", "a2"],
"B": ["b1", "b3", "b1", "b3"],
"X": [1, 2, 3, 4]
}
).set_index(["A", "B"])
视觉:
V
A B C
a1 b1 c1 1
c2 2
b2 c1 3
a2 b1 c1 4
b2 c1 5
c2 6
X
A B
a1 b1 1
b3 2
a2 b1 3
b3 4
期望的输出:
result = pandas.DataFrame(
{
"A": ["a1", "a1", "a2"],
"B": ["b1", "b1", "b1"],
"C": ["c1", "c2", "c1"],
"V": [1, 2, 4],
}
).set_index(["A", "B", "C"])
视觉:
V
A B C
a1 b1 c1 1
c2 2
a2 b1 c1 4
我试过了
df.loc[df2.index]
和 df.loc[df.index.intersection(df2.index)]
但这不起作用。
我想我可以做 df.join(df2, how="inner")
然后删除所有添加的 df2
列,但这很麻烦。或者有没有办法去掉 df2
的所有列?
如有任何帮助,我将不胜感激。
一种选择是在两者共有的特定标签上使用 isin
,并使用生成的布尔值过滤 df
:
df.loc[df.index.droplevel('C').isin(df2.index)]
V
A B C
a1 b1 c1 1
c2 2
a2 b1 c1 4