Как подсчитать значения из двух Dataframe, по разным строкам и нескольким условиям
имеется два Dataframe, у них есть 2 общих столбца. Нужно подсчитать количество значений исходя из данных нескольких столбцов. Есть ли возможность реализовать это без циклов, только возможностями pandas? Ссылка на таблицы для Dataframe: https://disk.yandex.ru/d/5lR5cUi-dhyOrA
df1
Out[58]:
name Type Type_2 Type_3
0 Ваня x G9 1
1 Ваня x D18 1
2 Ваня y G9 2
3 Ваня y D18 1
4 Вика x G9 3
5 Вика y D18 3
6 Леша x G9 2
7 Леша y D18 1
8 Леша y G9 2
df2
Out[59]:
name Type_2 Type_4
0 Ваня G9 4
1 Ваня D18 3
2 Вика G9 4
3 Вика D18 4
4 Леша G9 5
5 Леша D18 3
Должно получится так:
resdf
Out[61]:
name Type_count_1 Type_count_2 Type_count_3
0 Ваня q w e
1 Вика q w e
2 Леша q w e
Формулы примерно такие:
Q (x)= Type_4(Type_2) — Type_3(Type_2)
W (y) = Type_4(Type_2) — Type_3(Type_2)
E (y) = summ Type_3
то есть q это разница между значением столбца Type_4 и Type_3 с одинаковым значением Type_2 для строк с х в столбце Type в df1;
w - это тоже самое, только для значений y;
e - сумма значений столбца Type_3 для значений y.
Объяснил как мог, что-бы было понятно, если что попытаюсь разъяснить более понятно. Например для Вики:
q = 4 - 3 = 1
w = 4 - 3 = 1
e = 3
У других больше значений x и y, соответственно после будет сумма результатов
Ответы (1 шт):
Подобные вопросы надо как-то разбивать, что-ли, на части. В общем, если я правильно понял задачу, то можно просто сделать как-то так:
res = df1.merge(df2, on=["name", "Type_2"])
res["QW"] = res["Type_4"] - res["Type_3"]
res["E"] = res.loc[res["Type"]=="y"].groupby("name")["Type_3"].transform(sum)
в столбце QW будут ваши q и w в соответствии с Type.
name Type Type_2 Type_3 Type_4 QW E
0 Ваня x G9 1 4 3 NaN
1 Ваня y G9 2 4 2 3.0
2 Ваня x D18 1 3 2 NaN
3 Ваня y D18 1 3 2 3.0
4 Вика x G9 3 4 1 NaN
5 Вика y D18 3 4 1 3.0
6 Леша x G9 2 5 3 NaN
7 Леша y G9 2 5 3 3.0
8 Леша y D18 1 3 2 3.0