使用另一个DataFrame的多级索引来筛选另一个DataFrame。

5
我有两个数据框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')]

我得到了相同的结果,第一列是索引值的元组/列表,第二列是来自DF1的数值列。 - mike01010
你使用的pandas版本是什么? - unutbu
我正在使用Pandas 0.14.1版本。 - mike01010
我已经准备了一个可运行的示例,使用df1.loc[df2.index]和Pandas 0.14.0成功。请修改示例以便我们可以复制错误。 - unutbu
我认为这是一个数据问题(无法发布实际使用的数据,因为有成千上万行)。我相信这与df2.index中的索引在df1中找不到有关,但不确定,稍后会进行测试。我通过使用intersect解决了这个问题。 - mike01010

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接