Найдите разные строки между двумя кадрами данных Polars на основе идентификатора и нескольких столбцов.Python

Программы на Python
Ответить
Anonymous
 Найдите разные строки между двумя кадрами данных Polars на основе идентификатора и нескольких столбцов.

Сообщение Anonymous »

У меня есть два кадра данных Polars (df1 и df2) с одинаковыми столбцами.
Я хочу сравнить их по идентификатору и имени и получить строки, в которых находится любой из других столбцов (X, Y, Z) различаются между собой.
import polars as pl

def add_suffix(df: pl.DataFrame, suffix: str) -> pl.DataFrame:
return df.select(
pl.col("ID"),
pl.all().exclude(["ID"]).name.suffix(suffix),
)

df1 = pl.DataFrame(
{
"ID": [1, 1, 2, 3, 3],
"Iname": ["foo", "bar", "baz", "foo2", "bar"],
"X": [10, 20, 30, 40, 20],
"Y": [100, 200, 300, 50, 20],
"Z": [1000, 2000, 3000, 80, 20],
}
)

df2 = pl.DataFrame(
{
"ID": [1, 3, 3],
"Iname": ["foo", "foo2", "baz"],
"X": [20, 25, 40],
"Y": [150, 200, 50],
"Z": [2000, 2000, 80],
}
)

df1 = df1.pipe(add_suffix, "_1")
df2 = df2.pipe(add_suffix, "_2")

test = df1.join(df2, how="full", on=["ID"], coalesce=True)
test = test.select(sorted(test.columns)).sort("ID")
print(test)

shape: (7, 9)
┌─────┬─────────┬─────────┬─────┬───┬─────┬──────┬──────┬──────┐
│ ID ┆ Iname_1 ┆ Iname_2 ┆ X_1 ┆ … ┆ Y_1 ┆ Y_2 ┆ Z_1 ┆ Z_2 │
│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ --- ┆ --- ┆ --- ┆ --- │
│ i64 ┆ str ┆ str ┆ i64 ┆ ┆ i64 ┆ i64 ┆ i64 ┆ i64 │
╞═════╪═════════╪═════════╪═════╪═══╪═════╪══════╪══════╪══════╡
│ 1 ┆ foo ┆ foo ┆ 10 ┆ … ┆ 100 ┆ 150 ┆ 1000 ┆ 2000 │
│ 1 ┆ bar ┆ foo ┆ 20 ┆ … ┆ 200 ┆ 150 ┆ 2000 ┆ 2000 │
│ 2 ┆ baz ┆ null ┆ 30 ┆ … ┆ 300 ┆ null ┆ 3000 ┆ null │
│ 3 ┆ foo2 ┆ foo2 ┆ 40 ┆ … ┆ 50 ┆ 200 ┆ 80 ┆ 2000 │
│ 3 ┆ foo2 ┆ baz ┆ 40 ┆ … ┆ 50 ┆ 50 ┆ 80 ┆ 80 │
│ 3 ┆ bar ┆ foo2 ┆ 20 ┆ … ┆ 20 ┆ 200 ┆ 20 ┆ 2000 │
│ 3 ┆ bar ┆ baz ┆ 20 ┆ … ┆ 20 ┆ 50 ┆ 20 ┆ 80 │
└─────┴─────────┴─────────┴─────┴───┴─────┴──────┴──────┴──────┘

Я попробовал выполнить полное соединение для "ID", но при этом также сравниваются строки, которые на самом деле не совпадают с "Iname".
Например, "bar" в df1 сравнивается с "foo" в df2, чего не должно происходить, поскольку в df2 нет "bar".
Ожидаемый результат:
expected_df = pl.DataFrame(
{
"ID": [1,1,2,3,3,3],
"Iname_1": ["foo","bar","baz","foo2","bar",None],
"Iname_2": ["foo",None,None,"foo2",None,"baz"],
"X_1": [10,20,30,20,20,None],
"X_2": [20,None,None,25,None,40],
"Y_1": [100,200,300,50,40,None],
"Y_2": [150,None,None,200,None,50],
"Z_1": [1000,2000,3000,80,20,None],
"Z_2": [2000,None,None,2000,None,80],
}
)


Подробнее здесь: https://stackoverflow.com/questions/798 ... iple-colum
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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