Использование функции Lookup для DataFrame с двустрочным заголовком
У меня есть 2 таблицы (DataFrame). Первая с двустрочным заголовком:
lvl0 ID 2020 2021
lvl1 1 2 3 1 2 3
A 1 0 3 2 1 1
B 5 4 7 6 2 2
C 9 8 11 10 3 3
D 13 12 15 14 4 4
E 17 16 19 18 5 5
Где первая строка в таблице означает собой год, а вторая строка - вариант реализации (1,2,3), и далее в таблице для каждого Id предусмотрены свои значения.
И вторая таблица:
ID Var
A 1
B 1
C 1
D 2
E 1
F 2
G 3
Задача во вторую таблицу для каждого ID добавить значения по условию из варианта реализации Var. То есть, я пытаюсь сделать Lookup значения во вторую таблицу, если оно удовлетворяет критерию var. Значение должно браться из соответсвующей варианту реализации колонки в таблицы 1, но так необходимо сделать для каждого года. Должно быть так:
ID Var 2020 2021
A 1 1 1
B 1 5 2
C 1 9 6
D 2 12 4
E 1 17 18
Для обычной таблицы (DataFrame) с одной строкой заголовка отлично работает следующий вариант:
df2[2020] = df1.set_index('ID').lookup(df2['ID'], df2['Var'])
А вот как сделать для сложного заголовка, не пойму. Годов будет много до 2040, как и вариантов ID.
Ответы (1 шт):
Попробуйте так:
res = \
(df
.set_index("ID")
.groupby(level=0, axis=1)
.apply(lambda x:
pd.Series(x.droplevel(0, axis=1).lookup(df2["ID"], df2["Var"]),
name=x.columns.get_level_values(0)[0])))
res.insert(0, "ID", df["ID"])
res.insert(1, "Var", df2["Var"])
результат:
In [97]: res
Out[97]:
ID Var 2020 2021
0 A 1 1 2
1 B 1 5 6
2 C 1 9 10
3 D 2 12 4
4 E 1 17 18
исходные фреймы:
In [98]: df
Out[98]:
ID 2020 2021
1 2 3 1 2 3
0 A 1 0 3 2 1 1
1 B 5 4 7 6 2 2
2 C 9 8 11 10 3 3
3 D 13 12 15 14 4 4
4 E 17 16 19 18 5 5
In [99]: df2
Out[99]:
ID Var
0 A 1
1 B 1
2 C 1
3 D 2
4 E 1