Индекс - совпадение с использованием панд - PullRequest
0 голосов
/ 03 октября 2018

У меня есть следующие 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.dates & df1.currency.Например: Поиск текущего обменного курса 'aud' на '02-Jan'

Это можно решить с помощью функции Index + Match в Excel.Как лучше всего воспроизвести это в Pandas.

Желаемый результат: добавить новый столбец '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 голосов
/ 03 октября 2018

Лучший эквивалент INDEX MATCH: DataFrame.lookup:

df2 = df2.set_index('dates')
df1['price'] = df2.lookup(df1['dates'], df1['currency'])
0 голосов
/ 03 октября 2018

Изменение формы 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
...