选择索引值等于熊猫另一个数据框中的列的索引值的多级索引数据框中的行

时间:2018-09-19 10:09:52

标签: python pandas dataframe select

有两个数据帧,其中一个多级索引在另一个列中显示为列,其想法是从第一行中选择那些索引值与相应列值相同的行。

示例

具有以下两个数据帧df1df2

df1 = pd.DataFrame({'i1': ['a1', 'a2', 'a3'], 'i2': ['b1', 'b2', 'b3'], 'c': [1, 2, 3]})
df1 = df1.set_index(['i1', 'i2'])

       c
i1 i2   
a1 b1  1
a2 b2  2
a3 b3  3


df2 = pd.DataFrame({'i1': ['a1', 'a3'], 'i2': ['b1', 'b3']})

   i1  i2
0  a1  b1
1  a3  b3

选择df1的那些行,它们的索引值i1i2i1中的列i12df2具有相同的值导致:

       c
i1 i2   
a1 b1  1
a3 b3  3

1 个答案:

答案 0 :(得分:2)

Index.isinMultiIndex一起使用:

df = df1[df1.index.isin(df2.set_index(['i1','i2']).index)]

替代:

df = df1[df1.index.isin(pd.MultiIndex.from_arrays([df2['i1'], df2['i2']]))]

或使用mergejoin-但必须重置并设置索引:

df = df1.reset_index().merge(df2).set_index(['i1', 'i2'])
df = df2.join(df1, on=['i1', 'i2'], how='inner').set_index(['i1', 'i2'])

print (df)
       c
i1 i2   
a1 b1  1
a3 b3  3