pandas объединение по мультииндексу с критериями на одном уровне - PullRequest
1 голос
/ 29 апреля 2020

У меня df1 проиндексирован с 3 уровнями и df2 проиндексирован с теми же 3 уровнями. Давайте предположим, что date,name,criteria - это 3 столбца, по которым индексируются эти два кадра данных.

Я бы хотел "объединить" df2 в df1 так, чтобы для каждого уровня индекса a_date,a_name,a_criteria в df1, значения, которые объединяются из df2 match a_date,a_name,specific_criteria, где specific_criteria - постоянное значение.

В итоге я сделал что-то похожее на приведенное ниже, и мне стало интересно, есть ли более элегантный способ?

new_df1= pd.DataFrame()
for group_name, group_df in df1.groupby(level=[0, 1]):
    index_level = group_name + ("0M","field_v1",)
    group_df["bla2"] = df2.loc[index_level, "bla2"]
    new_df1 = pd.concat([new_df1, group_df])


Пример данных:

df1:

date    asset   tenor   bla value
1/3/2005    AEX 12M 100 0.155346154
1/3/2005    AEX 12M 102.5   0.150401253
1/3/2005    AEX 12M 105 0.142983901
1/3/2005    AEX 12M 107.5   0.137154123
1/3/2005    AEX 12M 110 0.133267604
1/3/2005    AEX 6M  112.5   0.130425064
1/3/2005    AEX 6M  115 0.126161253
1/3/2005    AEX 6M  117.5   0.12344318
1/3/2005    AEX 6M  120 0.121631132
1/3/2005    AEX 6M  80  0.210254154

df2:

tenor   field   bla2    date
0M  field_v1    351.91  1/3/2005
0M  field_v2    351.91  1/3/2005
0M  field_v3    347.7   1/3/2005

Я хотел бы получить следующее result_df1 (bla2 значение (351,91) для (1/3/2005,AEX,0M,field_v1") в df2 для всех (1/3/2005,AEX) строк в df1:

date    asset   tenor   bla value   bla2
1/3/2005    AEX 12M 100 0.155346154 351.91
1/3/2005    AEX 12M 102.5   0.150401253 351.91
1/3/2005    AEX 12M 105 0.142983901 351.91
1/3/2005    AEX 12M 107.5   0.137154123 351.91
1/3/2005    AEX 12M 110 0.133267604 351.91
1/3/2005    AEX 6M  112.5   0.130425064 351.91
1/3/2005    AEX 6M  115 0.126161253 351.91
1/3/2005    AEX 6M  117.5   0.12344318  351.91
1/3/2005    AEX 6M  120 0.121631132 351.91
1/3/2005    AEX 6M  80  0.210254154 351.91

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Для меня работает фильтр по DataFrame.xs, а затем DataFrame.join:

df22 = df2.xs(('0M','field_v1'), level=[2,3])
new_df1 = df1.join(df22)
0 голосов
/ 30 апреля 2020

В случае, если это кому-то полезно, вы можете сделать

df1["tenor2"] = "0M"
df1["field"] = "field_v1"
df1.set_index(["date","tenor2","field"]
df2.set_index(["date","tenor","field"]
df1.join(df2)

РЕДАКТИРОВАТЬ: лучшее решение от @ jezrael

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...