У меня есть два кадра данных 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
Найдите разные строки между двумя кадрами данных Polars на основе идентификатора и нескольких столбцов. ⇐ Python
Программы на Python
1762289338
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],
}
)
Подробнее здесь: [url]https://stackoverflow.com/questions/79809305/find-differing-rows-between-two-polars-dataframes-based-on-id-and-multiple-colum[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия