使用另一个数据框的多重索引过滤一个数据框
我有两个数据表,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')]