索引-使用熊猫进行匹配

时间:2018-10-03 03:38:18

标签: python pandas dataframe lookup data-munging

我有以下2个数据帧:

df1 = pd.DataFrame({
    'dates': ['02-Jan','03-Jan','30-Jan'],
    'currency': ['aud','gbp','eur'],
    'amount': [100,330,500]
})

df2 = pd.DataFrame({
    'dates': ['01-Jan','02-Jan','03-Jan','30-Jan'],
    'aud': [0.72,0.73,0.74,0.71],
    'gbp': [1.29,1.30,1.4,1.26],
    'eur': [1.15,1.16,1.17,1.18]
})

我想获得df1.datesdf1.currency的交集。例如:在'02 -Jan'上查询流行的'aud'汇率

可以使用excel的Index + Match功能来解决。在熊猫中复制它的最佳方法是什么。

所需的输出:添加新列'price'

dates  currency amount price
02-Jan aud      100    0.73
03-Jan gbp      330    1.4
30-Jan eur      500    1.18

2 个答案:

答案 0 :(得分:1)

重塑df2使得进行简单合并变得容易得多:

In [42]: df2.set_index("dates").unstack().to_frame("value")
Out[42]:
            value
    dates
aud 01-Jan   0.72
    02-Jan   0.73
    03-Jan   0.74
    30-Jan   0.71
gbp 01-Jan   1.29
    02-Jan   1.30
    03-Jan   1.40
    30-Jan   1.26
eur 01-Jan   1.15
    02-Jan   1.16
    03-Jan   1.17
    30-Jan   1.18

以这种形式,您只需要将df1字段与df2的新索引进行匹配,如下所示:

In [43]: df1.merge(df2.set_index("dates").unstack().to_frame("value"), left_on=["currency", "dates"], right_index=True)
Out[43]:
    dates currency  amount  value
0  02-Jan      aud     100   0.73
1  03-Jan      gbp     330   1.40

如果您不想丢失丢失的数据,也可以将其合并(为此,我不得不对您的df1进行一些修复:

In [44]: df1.merge(df2.set_index("dates").unstack().to_frame("value"), left_on=["currency", "dates"], right_index=True, how="left")
Out[44]:
    dates currency  amount  value
0  02-Jan      aud     100   0.73
1  03-Jan      gbp     330   1.40
2  04-Jan      eur     500    NaN

答案 1 :(得分:1)

INDEX MATCH的最佳等效项是DataFrame.lookup

df2 = df2.set_index('dates')
df1['price'] = df2.lookup(df1['dates'], df1['currency'])