Как передать выражения из списка выражений в Python Polars

Я не могу уложить в голове это. Допустим, у меня есть словарь регулярных выражений и строк замены, которые я хочу заменить, и если ни одно из этих регулярных выражений не совпадает (когда возвращается False), я хочу возобновить работу со следующим оператором if.

Итак, вместо этого не проверяются данные в «новых данных»...

all_items = pl.DataFrame(
    {
        "data": ["Swedish fish", "English tea", "", "", ""],
        "ISO_codes": ["fin", "nor", "eng", "eng", "swe"],           
    })


replacement_rules = {
    r"^Swe.*": "Svenska",
    r"^Eng.*": "English",
    
}

iso_tranlation = {
   "swe": "Svenska",
   "eng": "English",
   "nor": "Norsk",
   "fin": "Finska på finska",

}

for pattern, replacement in replacement_rules.items():
    all_items = (
        all_items.lazy()
        .with_columns(
            pl.when(pl.col("data").str.contains(pattern))
            .then(pl.lit(replacement))
            .alias("new_data")
        )
        .collect()
    ) 

all_items = (
    all_items.lazy()
    .with_columns(
        pl.when(pl.col("ISO_codes").str.len_chars() > 0)
        .then(
            pl.col("ISO_codes")
            .replace(iso_tranlation , default = "Unknown ISO Code")
        )
        .alias("new_data")
    )
    .collect()
)

...я хотел бы сделать что-то вроде этого:

expressions = [
    pl.when(pl.col("data").str.contains(pattern))
    .then(pl.lit(replacement))
     for pattern, replacement in replacement_rules.items()]

all_items = (
    all_items.lazy()
    .with_columns(
        expressions.explode_and_pipe()
        .when(pl.col("ISO_codes").str.len_chars() > 0)
        .then(
            pl.col("ISO_codes")
            .replace(iso_tranlation , default = "Unknown ISO Code")
        )
        .alias("new_data")
    )
    .collect()
)

Есть ли способ добиться этого expressions.explode_and_pipe()?

Обновлено: Это полученный фрейм данных, который мне нужен:

shape: (5, 3)
┌──────────────┬───────────┬──────────┐
│ data         ┆ ISO_codes ┆ new_data │
│ ---          ┆ ---       ┆ ---      │
│ str          ┆ str       ┆ str      │
╞══════════════╪═══════════╪══════════╡
│ Swedish fish ┆ fin       ┆ Svenska  │
│ English tea  ┆ nor       ┆ English  │
│              ┆ eng       ┆ English  │
│              ┆ eng       ┆ English  │
│              ┆ swe       ┆ Svenska  │
└──────────────┴───────────┴──────────┘

Вы хотите сказать, что all_data — это неправильный вывод? то есть вместо этого первая строка должна быть Svenska? Если да, можете ли вы добавить ожидаемый результат?

jqurious 07.04.2024 17:03

Итак, цель состоит в том, чтобы закоротить и сделать так, чтобы каждый элемент new_data был либо первым соответствием replacement_rules для data, либо, если совпадений не найдено, первым соответствием iso_tranlation [так в оригинале] для ISO_code?

BallpointBen 07.04.2024 21:27
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
113
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Может быть, вы ищете что-то подобное? (coalesce может быть той функцией, которая вам нужна.)

replacements = pl.lit(None)
for pattern, replacement in replacement_rules.items():
    replacements = (
        pl.when(pl.col("data").str.contains(pattern))
        .then(pl.lit(replacement))
        .otherwise(replacements)
    )

iso_translations = pl.col("ISO_codes").replace(
    iso_translation, default = "Unknown ISO Code"
)

all_items.with_columns(new_data=pl.coalesce(replacements, iso_translations))
shape: (5, 3)
┌──────────────┬───────────┬──────────┐
│ data         ┆ ISO_codes ┆ new_data │
│ ---          ┆ ---       ┆ ---      │
│ str          ┆ str       ┆ str      │
╞══════════════╪═══════════╪══════════╡
│ Swedish fish ┆ fin       ┆ Svenska  │
│ English tea  ┆ nor       ┆ English  │
│              ┆ eng       ┆ English  │
│              ┆ eng       ┆ English  │
│              ┆ swe       ┆ Svenska  │
└──────────────┴───────────┴──────────┘

Ух ты, читая о слиянии, кажется, что этот подход должен сработать. Завтра попробую первым делом!

Fontanka16 07.04.2024 22:17

Я позаимствовал вашу таблицу конечных результатов.

Fontanka16 08.04.2024 08:54

выражения «когда/то» также можно объединять в цепочки:

pl.when().then().when().then()

Это даст вам семантику if/elif:

IF   ... 
ELIF ...
ELIF ...

False/None можно использовать в качестве начального «недействующего параметра» для программного создания:

expr = pl.when(False).then(None)

for pattern, replacement in replacement_rules.items():
    expr = expr.when(pl.col("data").str.contains(pattern))
    expr = expr.then(pl.lit(replacement))
   
expr = expr.when(pl.col("ISO_codes").str.len_chars() > 0)
expr = expr.then(            
    pl.col("ISO_codes")
      .replace(iso_translation, default = "Unknown ISO Code")
)
>>> df.with_columns(new_data = expr)
shape: (5, 3)
┌──────────────┬───────────┬──────────┐
│ data         ┆ ISO_codes ┆ new_data │
│ ---          ┆ ---       ┆ ---      │
│ str          ┆ str       ┆ str      │
╞══════════════╪═══════════╪══════════╡
│ Swedish fish ┆ fin       ┆ Svenska  │
│ English tea  ┆ nor       ┆ English  │
│              ┆ eng       ┆ English  │
│              ┆ eng       ┆ English  │
│              ┆ swe       ┆ Svenska  │
└──────────────┴───────────┴──────────┘

Очень хорошо! Именно этого пути я и добивался изначально. Эти два ответа должны оказаться очень полезными для людей в будущем.

Fontanka16 09.04.2024 18:04

Другие вопросы по теме