Используйте поляры .when() вместо объединенияPython

Программы на Python
Anonymous
Используйте поляры .when() вместо объединения

Сообщение Anonymous »

У меня есть 3 полярных фрейма данных: один содержит 2 IDS, а другие содержат идентификатор и значение. Я хотел бы присоединиться к трем фреймам данных, если идентификатор основной таблицы существует в одной из других таблиц, и перенести значения из нужного столбца.
Мой текущий подход - просто переименовывать каждый идентификатор таблицы, а затем выполнять .join(how = 'left'), однако я думаю, что переименование и дублирование таблиц - это неправильный способ решения этой проблемы. (Из-за дополнительного кода и потраченной впустую оперативной памяти)
Первый содержит 2 столбца идентификаторов:

Код: Выделить всё

data = {
"ID1" : [1,2,3],
"ID2" : [1,4,5]
}
df = pl.DataFrame(data)
Второй и третий — это фреймы данных, которые содержат идентификатор и значение:

Код: Выделить всё

T1 = {
"ID" : [9,2,5],
"Values" : ["A","B","c"],
"Values II" : ["foo","boo","baz"]
}
T1 = pl.DataFrame(T1)

T2 = {
"ID" : [1,4,10],
"Values" : ["X","J","c"]
}
T2 = pl.DataFrame(T2)
Я могу проверить, существует ли идентификатор в других таблицах, подобных этой

Код: Выделить всё

(
df
.with_columns(
ID1_is_on_T1 = pl.col("ID1").is_in(T1.select(pl.col("ID"))),
ID2_is_on_T1 = pl.col("ID2").is_in(T1.select(pl.col("ID"))),
ID1_is_on_T2 = pl.col("ID1").is_in(T2.select(pl.col("ID"))),
ID2_is_on_T2 = pl.col("ID2").is_in(T2.select(pl.col("ID"))),
)
)
И я хочу сделать что-то вроде этого:

Код: Выделить всё

(
df
.with_columns(
pl
.when(
pl.col("ID1").is_in(T1.select(pl.col("ID")))
)
.then(
T1.select(pl.col("Values"))
)
.otherwise(0)
)
)

Код: Выделить всё

ValueError: can only call .item() if the dataframe is of shape (1, 1), or if explicit row/col values are provided; frame has shape (3, 1)
Текущий подход .join():

Код: Выделить всё

T1_1 = (
T1
.rename(
{"ID": "ID1"}
)
)

T1_2 = (
T1
.rename(
{"ID": "ID2"}
)
)

Join_1 = df.join(T1_1,on = "ID1", how="left").rename({"Values" : "ID1_Values", "Values II" : "ID1_Values II"})
Join_2 = Join_1.join(T1_2, on = "ID2", how="left").rename({"Values" : "ID2_Values", "Values II" : "ID2_Values II"})
При таком подходе рассматривается только первая таблица, мне нужно будет сделать то же самое и для T2.

Подробнее здесь: https://stackoverflow.com/questions/789 ... tead-joins

Вернуться в «Python»