python - 使用另一个数据帧的多索引过滤一个数据帧

标签 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

为此,我只需使用:

f_df = df1.ix[df2.index]

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

                            Value

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

我怎样才能实现我正在寻找的东西?这是没有元组索引的结果数据帧?

最佳答案

在 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 can accept a list of labels , 而 df2.index 是类似列表的:

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

关于python - 使用另一个数据帧的多索引过滤一个数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26477548/

相关文章:

python - Pandas 数据框选择列表列包含任何字符串列表的行

python - postgres 找到所有者为 'abc' 的所有数据库?

python - 通过聚合按时间段对 DataFrame 进行分组

python - Plotly:如何自定义图例顺序?

python - Pytorch 张量到 numpy 数组

python - 如何在 DateTimeIndex 中选择唯一日期的行

python - 如何在乘以 10 的幂后找出最接近小数的整数

python - 规范化 numpy 数组

python - View 函数未正确创建 View

python - 平铺数据以创建 pandas 数据框