У меня есть пример таблицы, в которой представлена зарплата всех сотрудников компании:
А также есть еще одна таблица, показывающая увеличение заработной платы, которое необходимо применить:
Увеличение может применяться кумулятивно и при совпадении одного из ключей. Например, Итан может получить два типа повышения в сочетании:
Имея это в виду, моя цель — получить следующую таблицу, если объединить две вышеуказанные таблицы:
Есть ли у кого-нибудь какие-либо предложения по методу или типу соединения, который может «избежать» этих нулевых случаев, когда у меня есть совпадение в любом из ключевых столбцов (PLANT, DEPTO или NAME)?
@Джонатан мог бы быть способом, но основная проблема здесь заключается в том, что мне нужно применить увеличение зарплаты не только на один или два ключевых столбца... Это нужно применить путем комбинации этих ключевых столбцов... в конце концов, иногда я могу сделать это по названию, по дептам или растениям, или их комбинации. Это много возможностей.
Я нашел способ создавать объединения «условно», который позволяет «избегать» нулей... Я работаю над этим, чтобы посмотреть, сработает ли он в моем случае: stackoverflow.com/questions/70890880/…
Для будущих читателей, у которых возникнет такая же проблема, я смог решить ее, следуя идее условного соединения, описанной в этом посте.
По сути, я создал переменную, в которой хранятся условия, которые заменяют каждое нулевое значение соответствующим значением в таблице фактов, получив следующую таблицу:
# make condition to join increase_df and fact_df
condition = (
(fn.coalesce(increase_df.PLANT, fact_df.PLANT) == fact_df.PLANT) &
(fn.coalesce(increase_df.DEPTO, fact_df.DEPTO) == fact_df.DEPTO) &
(fn.coalesce(increase_df.NAME, fact_df.NAME) == fact_df.NAME)
)
final_df = (
fact_df
.join(increase_df, condition, "left")
)
final_df.show()
+-----+-----+-----+------+-----------+-----+-----+----+------+
|PLANT|DEPTO| NAME| VALUE|INCREASE_ID|PLANT|DEPTO|NAME|FACTOR|
+-----+-----+-----+------+-----------+-----+-----+----+------+
| 1| MG|KEVIN|1100.0| IC1| 1| MG|null| 1.2|
| 2| SP|ETHAN|1200.0| IC5| null| SP|null| 1.02|
| 2| SP|ETHAN|1200.0| IC2| 2| SP|null| 1.4|
| 3| DF| JUAN|1200.0| IC3| 3| DF|null| 1.3|
| 4| SP| BETH|1100.0| IC5| null| SP|null| 1.02|
| 4| SP| BETH|1100.0| IC4| 4| SP|BETH| 1.3|
| 5| SP| JOHN|1000.0| IC5| null| SP|null| 1.02|
+-----+-----+-----+------+-----------+-----+-----+----+------+
После этого я просто агрегировал значения:
+-----+-----+-----+------+------+-----------+
|PLANT|DEPTO| NAME| VALUE|FACTOR|INCREASE_ID|
+-----+-----+-----+------+------+-----------+
| 1| MG|KEVIN|1100.0| 1.2| IC1|
| 2| SP|ETHAN|1200.0| 1.428|IC5 and IC2|
| 3| DF| JUAN|1200.0| 1.3| IC3|
| 4| SP| BETH|1100.0| 1.326|IC5 and IC4|
| 5| SP| JOHN|1000.0| 1.02| IC5|
+-----+-----+-----+------+------+-----------+
Я думаю, это соединение двумя левыми: первое через
PLANT
, второе черезDEPTO
? Для левого соединения даже при отсутствии соответствующего ключа пустые столбцы все равно будут существовать.