mik*_*010 5 python numpy pandas
我有以下两个数据帧 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
Run Code Online (Sandbox Code Playgroud)
为此,我只需使用:
f_df = df1.ix[df2.index]
Run Code Online (Sandbox Code Playgroud)
但是,当这样做时,我得到的是这个(注意元组索引)
Value
(2014-05-31, 1002, n2) 2
(2014-06-31, 1003, n3) 4
Run Code Online (Sandbox Code Playgroud)
我怎样才能实现我正在寻找的东西?这是没有元组索引的结果数据帧?
在 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])
Run Code Online (Sandbox Code Playgroud)
产量
Value
Date ID Name
2014-05-31 1002 n2 2
2014-06-30 1003 n3 3
Run Code Online (Sandbox Code Playgroud)
我相信这是因为从 0.14 版本开始df.loc可以接受标签列表,并且df2.index类似于列表:
In [88]: list(df2.index)
Out[88]: [('2014-05-31', 1002L, 'n2'), ('2014-06-30', 1003L, 'n3')]
Run Code Online (Sandbox Code Playgroud)