使用另一个数据框的多重索引过滤一个数据框

5 投票
1 回答
1460 浏览
提问于 2025-04-28 16:50

我有两个数据表,DF1 和 DF2。我想根据 DF2 的多重索引来筛选 DF1。

DF1:
                            Value
Date        ID      Name       
2014-04-30  1001    n1        1
2014-05-31  1002    n2        2
2014-06-30  1003    n3        3
2014-07-31  1004    n4        4

DF2 (index = Date, ID, Name):
Date        ID      Name       
2014-05-31  1002    n2        
2014-06-30  1003    n3        

What i would like is this:
                            Value
Date        ID      Name       
2014-05-31  1002    n2        2
2014-06-30  1003    n3        3

为此,我只需使用:

f_df = df1.ix[df2.index]

但是,当我这样做时,得到的结果是这样的(注意这个元组索引)

                            Value

(2014-05-31, 1002, n2)      2
(2014-06-31, 1003, n3)      4

我该如何才能得到我想要的结果呢?也就是一个没有元组索引的数据表?

暂无标签

1 个回答

3

在Pandas 0.14版本中,你可以使用 df1.loc[df2.index] 这个方法:

import io
import pandas as pd
print(pd.__version__)
# 0.14.0

df1 = io.BytesIO('''\
Date        ID      Name    Value   
2014-04-30  1001    n1        1
2014-05-31  1002    n2        2
2014-06-30  1003    n3        3
2014-07-31  1004    n4        4
''')

df2 = io.BytesIO('''\
Date        ID      Name    Value   
2014-05-31  1002    n2        2
2014-06-30  1003    n3        3
''')

df1 = pd.read_table(df1, sep='\s+').set_index(['Date', 'ID', 'Name'])
df2 = pd.read_table(df2, sep='\s+').set_index(['Date', 'ID', 'Name'])
print(df1.loc[df2.index])

这样做会得到

                      Value
Date       ID   Name       
2014-05-31 1002 n2        2
2014-06-30 1003 n3        3

我认为这是因为从0.14版本开始,df.loc 可以接受一个标签的列表,而 df2.index 就像一个列表一样:

In [88]: list(df2.index)
Out[88]: [('2014-05-31', 1002L, 'n2'), ('2014-06-30', 1003L, 'n3')]

撰写回答