AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 78915747
Accepted
blaylockbk
blaylockbk
Asked: 2024-08-27 01:53:38 +0800 CST2024-08-27 01:53:38 +0800 CST 2024-08-27 01:53:38 +0800 CST

如何在 python polars 数据框中正确拆分 n 次(模仿 pandas rsplit)

  • 772

我有一列字符串,其中末尾部分包含一些我需要解析到其自己的列中的信息。Pandas 具有rsplit函数可以从右侧拆分字符串,这正是我需要的:

import pandas as pd
pd.DataFrame(
    {
        "name": [
            "some_name_set_1",
            "some_name_set_1b",
            "some_other_name_set_2",
            "yet_another_name_set_2",
        ]
    }
)["name"].str.rsplit("_", n=2, expand=True)
                  0    1   2
0         some_name  set   1
1         some_name  set  1b
2   some_other_name  set   2
3  yet_another_name  set   2

rsplit我怎样才能在 Polars 中模仿这种行为,它现在还没有表情?

python-polars
  • 3 3 个回答
  • 26 Views

3 个回答

  • Voted
  1. Dogbert
    2024-08-27T02:06:14+08:002024-08-27T02:06:14+08:00

    这是一种仅使用一个.split然后使用三个不同的切片/获取操作来获取 3 个部分的方法:

    df = pl.DataFrame(
        {
            "name": [
                "some_name_set_1",
                "some_name_set_1b",
                "some_other_name_set_2",
                "yet_another_name_set_2",
            ]
        }
    )
    
    df = df.select(parts=pl.col("name").str.split("_")).select(
        a=pl.col("parts").list.slice(0, pl.col("parts").list.len() - 2).list.join("_"),
        b=pl.col("parts").list.get(-2),
        c=pl.col("parts").list.get(-1),
    )
    
    print(df)
    

    输出:

    shape: (4, 3)
    ┌──────────────────┬─────┬─────┐
    │ a                ┆ b   ┆ c   │
    │ ---              ┆ --- ┆ --- │
    │ str              ┆ str ┆ str │
    ╞══════════════════╪═════╪═════╡
    │ some_name        ┆ set ┆ 1   │
    │ some_name        ┆ set ┆ 1b  │
    │ some_other_name  ┆ set ┆ 2   │
    │ yet_another_name ┆ set ┆ 2   │
    └──────────────────┴─────┴─────┘
    

    相关:此问题正在跟踪right字符串拆分的增加。

    • 1
  2. Best Answer
    jqurious
    2024-08-27T02:18:28+08:002024-08-27T02:18:28+08:00

    单个字符分隔符可以用正则表达式来表示:

    df.select(
       pl.col("name").str.extract_groups(r"(.+)_([^_]+)_([^_]+)$")
         .struct.field("*")
    )
    
    shape: (4, 3)
    ┌──────────────────┬─────┬─────┐
    │ 1                ┆ 2   ┆ 3   │
    │ ---              ┆ --- ┆ --- │
    │ str              ┆ str ┆ str │
    ╞══════════════════╪═════╪═════╡
    │ some_name        ┆ set ┆ 1   │
    │ some_name        ┆ set ┆ 1b  │
    │ some_other_name  ┆ set ┆ 2   │
    │ yet_another_name ┆ set ┆ 2   │
    └──────────────────┴─────┴─────┘
    

    但它的功能有限,而且理解/输入起来有点尴尬。

    • 1
  3. blaylockbk
    2024-08-27T01:53:38+08:002024-08-27T01:53:38+08:00

    一个解决方案是分两部分进行

    对于名称部分(字符串的左侧):

    1. 拆分列表
    2. 反转列表
    3. 获取列表中第 3 到第 n 个项目
    4. 再次反转列表
    5. 使用原始分隔符加入列表

    对于集合和数字部分:

    1. 拆分列表
    2. 获取倒数第二件物品
    3. 转换为结构体并解除嵌套
    pl.DataFrame(
        {
            "name": [
                "some_name_set_1",
                "some_name_set_1b",
                "some_other_name_set_2",
                "yet_another_name_set_2",
            ]
        }
    ).with_columns(
        pl.col("name")
        .str.split("_")
        .list.reverse()
        .list.slice(2)
        .list.reverse()
        .list.join("_"),
        pl.col("name")
        .str.split("_")
        .list.slice(-2, None)
        .list.to_struct()
        .alias("end_stuff"),
    ).unnest("end_stuff")
    
    
    shape: (4, 3)
    ┌──────────────────┬─────────┬─────────┐
    │ name             ┆ field_0 ┆ field_1 │
    │ ---              ┆ ---     ┆ ---     │
    │ str              ┆ str     ┆ str     │
    ╞══════════════════╪═════════╪═════════╡
    │ some_name        ┆ set     ┆ 1       │
    │ some_name        ┆ set     ┆ 1b      │
    │ some_other_name  ┆ set     ┆ 2       │
    │ yet_another_name ┆ set     ┆ 2       │
    └──────────────────┴─────────┴─────────┘
    
    • 0

相关问题

  • Polars - 获取包含每行最大值的列名称

  • Polars 模式与列表类型不同

  • 当过滤器不匹配时,通过返回值来进行极性分组

  • 极地扫描镶木地板;有没有办法获取扫描的文件数量?

  • 部分基于其他列名称创建新列

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    为什么这个简单而小的 Java 代码在所有 Graal JVM 上的运行速度都快 30 倍,但在任何 Oracle JVM 上却不行?

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    何时应使用 std::inplace_vector 而不是 std::vector?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Martin Hope
    Aleksandr Dubinsky 为什么 InetAddress 上的 switch 模式匹配会失败,并出现“未涵盖所有可能的输入值”? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge 为什么这个简单而小的 Java 代码在所有 Graal JVM 上的运行速度都快 30 倍,但在任何 Oracle JVM 上却不行? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini 具有指定基础类型但没有枚举器的“枚举类”的用途是什么? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer 何时应使用 std::inplace_vector 而不是 std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB 为什么 GCC 生成有条件执行 SIMD 实现的代码? 2024-02-17 06:17:14 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve