#pandas #dataframe #numpy #select
Вопрос:
У меня есть фрейм данных с двумя столбцами, которые выглядят следующим образом:
GebTyp BAK
0 RH C
1 MFH A
2 RH J
3 RH F
4 RH K
... ... ..
25046 MFH C
25047 MFH G
25048 MFH I
25049 MFH A
25050 MFH B
И еще один со значениями для каждой пары этих двух столбцов.
BAK EFH/DHH RH MFH GMH HH
0 A 231.0 222.0 265.0 186.0 156.0
1 B 271.0 222.0 204.0 186.0 156.0
2 C 214.0 186.0 222.0 197.0 167.0
3 D 242.0 183.0 236.0 201.0 171.0
4 E 184.0 155.0 188.0 196.0 143.0
5 F 198.0 179.0 162.0 158.0 121.0
6 G 134.0 145.0 138.0 134.0 104.0
7 H 159.0 118.0 143.0 103.0 73.0
8 I 120.0 110.0 119.0 97.0 87.0
9 J 91.0 89.0 86.0 75.0 69.0
10 K NaN NaN NaN NaN NaN
11 L NaN NaN NaN NaN NaN
Я могу правильно присвоить каждому отдельному значению numpy.select
вот так:
def GWB()
conditions = [
(mc["BAK"] == "A" amp; mc["GebTyp"] == "EFH/DHH"),
(mc["BAK"] == "A" amp; mc["GebTyp"] == "RH"),
(mc["BAK"] == "A" amp; mc["GebTyp"] == "MFH"),
(mc["BAK"] == "A" amp; mc["GebTyp"] == "GMH"),
(mc["BAK"] == "A" amp; mc["GebTyp"] == "HH"),
]
values = [
(231),
(222),
(265).
(186),
(156)
]
df["result"] = np.select(conditions,values)
GWB()
Но это привело бы к примерно 80 строкам кода, также в этом случае я работаю только с первым кадром данных, присваивая значения вручную. Мне было интересно, будет ли более быстрый/короткий способ выполнить эту задачу?
Ответ №1:
Используйте DataFrame.merge
с DataFrame.melt
:
df = df1.merge(df2.melt('BAK', value_name='result', var_name='GebTyp'),
how='left',
on=['BAK','GebTyp'])
print (df)
GebTyp BAK result
0 RH C 186.0
1 MFH A 265.0
2 RH J 89.0
3 RH F 179.0
4 RH K NaN
5 ... .. NaN
6 MFH C 222.0
7 MFH G 138.0
8 MFH I 119.0
9 MFH A 265.0
10 MFH B 204.0
Комментарии:
1. Будет ли это также работать, если у меня есть несколько других столбцов в df1? Не упоминал о них, чтобы не подчеркивать масштаб вопроса
2. @Jonas — Я думаю, что да, но также возможно добавить
on
параметр для набора столбцов для объединения.