使用 Polars 将包含逗号分隔整数的字符串列转换为整数列

使用 polars 将包含逗号分隔整数的字符串列转换为整数列

本文介绍了如何使用 Polars 库将包含逗号分隔整数的字符串列转换为多个整数列。通过 `.str.strip_chars()`, `.cast(pl.List(pl.Int32))`, `.list.to_struct()` 以及 `.unpivot()` 和 `.pivot()` 等方法,可以高效地实现这一转换,并提供了代码示例进行演示,帮助读者更好地理解和应用。

在数据处理中,经常会遇到将包含逗号分隔数值的字符串列转换为数值列的需求。Polars 提供了多种方法来高效地完成这一任务。本文将介绍几种常用的方法,并提供详细的代码示例。

方法一:使用 str.strip_chars(), str.split(), cast() 和 list.to_struct()

这种方法的核心思想是先去除字符串末尾的逗号,然后将字符串分割成列表,再将列表转换为结构体,最后将结构体展开为多个列。

import polars as pldf = pl.DataFrame(    {        "chrom": ["1", "1", "2", "X"],        "blockSizes": ["10,29,", "20,22,", "30,25,", "40,23,"],        "blockStarts": ["0,50,", "0,45,", "0,60,", "0,70,"]    })cols = "blockSizes", "blockStarts"(df.with_columns(    pl.col(col)      .str.strip_chars(",")      .str.split(",")      .cast(pl.List(pl.Int32))      .list.to_struct(         n_field_strategy = "max_width",          fields = lambda idx, col=col: f"{col}_{idx}"      )    for col in cols ) .unnest(cols))

代码解释:

pl.col(col).str.strip_chars(“,”): 去除指定列 col 中字符串末尾的逗号。.str.split(“,”): 将字符串按照逗号分割成字符串列表。.cast(pl.List(pl.Int32)): 将字符串列表转换为整数列表。.list.to_struct(…): 将列表转换为结构体,n_field_strategy=”max_width” 表示使用列表的最大长度作为结构体的字段数量,fields=lambda idx, col=col: f”{col}_{idx}” 用于动态地为结构体字段命名,例如 blockSizes_0, blockSizes_1。.unnest(cols): 将结构体展开为多个列。

输出结果:

shape: (4, 5)┌───────┬──────────────┬──────────────┬───────────────┬───────────────┐│ chrom ┆ blockSizes_0 ┆ blockSizes_1 ┆ blockStarts_0 ┆ blockStarts_1 ││ ---   ┆ ---          ┆ ---          ┆ ---           ┆ ---           ││ str   ┆ i32          ┆ i32          ┆ i32           ┆ i32           │╞═══════╪══════════════╪══════════════╪═══════════════╪═══════════════╡│ 1     ┆ 10           ┆ 29           ┆ 0             ┆ 50            ││ 1     ┆ 20           ┆ 22           ┆ 0             ┆ 45            ││ 2     ┆ 30           ┆ 25           ┆ 0             ┆ 60            ││ X     ┆ 40           ┆ 23           ┆ 0             ┆ 70            │└───────┴──────────────┴──────────────┴───────────────┴───────────────┘

为了代码更简洁,可以定义一个函数来封装上述操作:

def csv_to_struct(col):    expr = pl.col(col).str.strip_chars(",").str.split(",")    expr = expr.cast(pl.List(pl.Int32))    return expr.list.to_struct(        n_field_strategy = "max_width",         fields = lambda idx: f"{col}_{idx}"    )cols = "blockSizes", "blockStarts"df.with_columns(map(csv_to_struct, cols)).unnest(cols)

方法二:使用 unpivot() 和 pivot()

这种方法的核心思想是先将数据进行 unpivot 操作,将多个列合并为一个列,然后对列进行处理,最后再进行 pivot 操作,将数据恢复为原来的形式。

小绿鲸英文文献阅读器 小绿鲸英文文献阅读器

英文文献阅读器,专注提高SCI阅读效率

小绿鲸英文文献阅读器 437 查看详情 小绿鲸英文文献阅读器

cols = "blockSizes", "blockStarts"(df.with_row_index()   .with_columns(      pl.col(cols).str.strip_chars(",").str.split(",").cast(pl.List(int))   )   .explode(cols)   .unpivot(index=["index", "chrom"], variable_name="name")   .with_columns(      pl.format("{}_{}",          "name",          pl.col("index").cum_count().over("index", "name") - 1      )   )   .pivot(on="name", index=["index", "chrom"]))

代码解释:

df.with_row_index(): 添加一个行索引列。pl.col(cols).str.strip_chars(“,”).str.split(“,”).cast(pl.List(int)): 与方法一相同,去除逗号,分割字符串,转换为整数列表。.explode(cols): 将列表展开为多行。.unpivot(index=[“index”, “chrom”], variable_name=”name”): 将 blockSizes 和 blockStarts 列 unpivot 为一个名为 name 的列。.with_columns(…): 创建新的列名,使用 pl.format 结合 pl.col(“index”).cum_count().over(“index”, “name”) – 1 生成 blockSizes_0, blockSizes_1 等列名。.pivot(on=”name”, index=[“index”, “chrom”]): 将数据 pivot 回原来的形式。

输出结果:

shape: (4, 6)┌───────┬───────┬──────────────┬──────────────┬───────────────┬───────────────┐│ index ┆ chrom ┆ blockSizes_0 ┆ blockSizes_1 ┆ blockStarts_0 ┆ blockStarts_1 ││ ---   ┆ ---   ┆ ---          ┆ ---          ┆ ---           ┆ ---           ││ u32   ┆ str   ┆ i64          ┆ i64          ┆ i64          ┆ i64           │╞═══════╪═══════╪══════════════╪══════════════╪═══════════════╪═══════════════╡│ 0     ┆ 1     ┆ 10           ┆ 29           ┆ 0             ┆ 50            ││ 1     ┆ 1     ┆ 20           ┆ 22           ┆ 0             ┆ 45            ││ 2     ┆ 2     ┆ 30           ┆ 25           ┆ 0             ┆ 60            ││ 3     ┆ X     ┆ 40           ┆ 23           ┆ 0             ┆ 70            │└───────┴───────┴──────────────┴──────────────┴───────────────┴───────────────┘

总结

本文介绍了两种使用 Polars 将包含逗号分隔整数的字符串列转换为整数列的方法。第一种方法使用了 str.strip_chars(), str.split(), cast() 和 list.to_struct(),思路清晰,易于理解。第二种方法使用了 unpivot() 和 pivot(),代码更简洁,但理解起来可能稍有难度。选择哪种方法取决于具体的需求和个人偏好。在实际应用中,可以根据数据的特点和性能要求选择最适合的方法。

注意事项:

确保字符串中的数值都是整数,否则在 cast() 步骤会报错。如果字符串中包含缺失值,需要先进行处理,例如使用 str.replace() 将缺失值替换为 0。如果列表的长度不一致,list.to_struct() 会使用最长的列表长度作为结构体的字段数量,较短的列表会用 None 填充。

希望本文能够帮助你更好地使用 Polars 进行数据处理。

以上就是使用 Polars 将包含逗号分隔整数的字符串列转换为整数列的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/920234.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
win10信任文件在哪里设置 win10添加信任文件的方法
上一篇 2025年11月29日 07:28:19
外星人电脑怎么刷机硬盘教程
下一篇 2025年11月29日 07:28:30

相关推荐

  • Java中如何实现客户信息管理系统

    答案:通过定义Customer类封装客户信息,CustomerManager类管理客户列表,实现增删改查功能,主程序测试操作流程,系统可扩展至数据库存储和界面开发。 实现一个客户信息管理系统,核心是管理客户的基本信息,比如姓名、电话、地址等,支持增删改查功能。在Java中可以通过面向对象设计结合集合…

    2026年9月23日
    200
  • windows11如何查看和导出事件查看器日志_windows11事件日志导出方法

    首先打开事件查看器,通过Win+R输入eventvwr.msc或右键开始菜单进入;接着在Windows日志中查看系统、安全和应用程序日志,双击事件查看详情;然后可按级别、来源或时间筛选日志;最后右键日志类型选择“将所有事件另存为”,支持.evtx、.txt或.csv格式导出文件用于分析或存档。 如果…

    2026年9月23日
    600
  • 如何在mysql中备份二进制日志

    答案:MySQL二进制日志备份可通过mysqlbinlog工具导出、直接复制日志文件、定时归档及结合mysqldump全量备份实现,需配合FLUSH LOGS和SHOW BINARY LOGS确保一致性,并制定保留策略以支持数据恢复。 在 MySQL 中,二进制日志(Binary Log)记录了所有…

    2026年9月23日
    100
  • RAID 0阵列对NVMe SSD性能的提升与数据安全风险分析

    RAID 0通过多NVMe SSD并行提升读写性能,理论速度翻倍且显著优化高负载响应,但无冗余导致任一硬盘故障即全阵列崩溃,数据恢复极难,仅建议用于可接受高风险的临时工作或性能优先场景,并必须配合外部备份。 raid 0通过将数据条带化分布在多个存储设备上,理论上可提升读写性能。在搭配nvme ss…

    用户投稿 2026年9月22日
    200
  • 如何在mysql中监控用户操作日志

    MySQL默认不记录用户操作日志,但可通过启用通用查询日志记录所有SQL操作,或使用二进制日志追踪数据变更,也可部署审计插件实现细粒度监控,结合独立账号管理和日志轮转策略提升安全性与可追溯性。 MySQL 本身不默认记录用户的所有操作日志,但可以通过启用特定的日志功能来实现对用户行为的监控。以下是几…

    2026年9月22日
    100
  • google浏览器如何导入其他浏览器的书签和密码_google浏览器导入书签和密码方法

    首先使用Google浏览器内置导入功能迁移书签和密码,选择源浏览器并勾选数据类型后导入;若无法识别,则通过HTML文件导入书签;密码可手动导出为CSV文件并在密码管理器中导入。 如果您需要将其他浏览器中的书签或密码迁移到 Google 浏览器,可以通过内置的导入功能快速完成数据转移。该操作适用于更换…

    2026年9月22日
    800
  • .com网站安全维护_保障.com网站稳定的措施

    答案:保障.com网站稳定需加强安全防护、定期备份、实时监控和应急准备。部署防火墙、更新系统、使用HTTPS、限制端口;制定自动备份并异地存储,定期恢复测试;利用监控工具检测可用性与异常流量,优化加载速度;建立应急流程,严格权限管理,定期演练。细节执行到位才能确保长期安全稳定运行。 确保.com网站…

    2026年9月21日
    300
  • mysql常用存储引擎有哪些

    InnoDB是现代MySQL应用的首选存储引擎,因其支持事务(ACID)、行级锁、外键约束、崩溃恢复和MVCC,适用于高并发、数据完整性要求高的OLTP场景;MyISAM虽读取快但仅支持表级锁且无事务和外键,适用于读多写少的简单场景,已逐渐被淘汰;Memory引擎将数据存于内存,速度快但易失,适合临…

    2026年9月21日
    000
  • 微信收藏内容丢失怎么办

    首先检查网络并刷新收藏页面,确认是否误删或设备缓存问题;接着通过电脑版或其他设备登录同一账号查看收藏是否同步存在;若内容仍可访问,说明数据未丢失,可重新同步;若已丢失且无备份,则无法通过官方途径单独恢复;建议将重要收藏导出为文档、截图或转发至“文件传输助手”,并定期同步至云笔记应用;同时保持微信更新…

    2026年9月21日
    300
  • Linux如何恢复被删除的用户数据

    恢复Linux被删数据需立即停用磁盘并使用photorec或extundelete等工具,结合快照或备份可提高恢复成功率。 恢复Linux中被删除的用户数据,并非易事,但并非完全不可能。可能性取决于数据被删除的方式、删除后系统是否被继续使用,以及是否采取了合适的预防措施。核心在于理解数据删除的机制,…

    2026年9月21日
    300
  • mysql如何启用binlog日志

    MySQL启用binlog需修改配置文件添加log-bin和server-id,重启服务后执行SHOW VARIABLES LIKE ‘log_bin’验证是否为ON,确认启用。 MySQL启用binlog日志需要修改配置文件并重启服务,同时可进行简单验证确保生效。以下是具体…

    2026年9月21日
    200
  • 如何快速在大量文件中进行全局搜索和替换?

    修改文件内容用Word或Notepad++批量替换,改文件名则用星优或核烁等重命名工具,结合Everything快速定位,提升效率。 面对大量文件时,全局搜索和替换的关键是选对工具。手动一个一个处理效率太低,用对方法能省下大量时间。核心思路是:根据你要改的是“文件里的文字”还是“文件的名字”,选择不…

    2026年9月21日
    200
  • 如何用Java制作简单的客户反馈系统

    答案:基于Java实现客户反馈系统,通过Feedback类封装数据,使用ArrayList存储反馈信息,结合Scanner实现控制台交互,支持提交与查看反馈功能。 用Java制作一个简单的客户反馈系统,重点在于实现数据收集、存储和查看功能。不需要复杂的框架也能快速搭建出可用的原型。以下是具体实现思路…

    2026年9月20日
    000
  • soul更新后聊天记录会没了吗_Soul更新后聊天记录说明

    更新后聊天记录是否保留取决于云同步与本地存储。一、确认账号已登录并开启“聊天记录同步”功能,重新登录以拉取云端数据;二、检查应用存储中数据是否为零,通过文件管理器查找本地历史记录文件尝试导入;三、若无法恢复,联系Soul客服提交问题表单并提供凭证,申请服务器端数据恢复。 如果您在使用Soul时遇到应…

    2026年9月20日
    000
  • 如何用ChatGPT来重构优化一段旧代码_提升代码质量与性能的步骤

    明确目标并提供上下文,分步引导ChatGPT优化代码结构、算法和语言特性,最后验证建议并本地测试,确保重构有效且安全。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 用ChatGPT来重构和优化旧代码是一种高效提升代码质量与性能的方式。关键…

    2026年9月12日
    200
  • mysql如何优化日志写入

    合理配置InnoDB日志参数、调整binlog写入策略、关闭非必要日志并优化存储硬件,可显著提升MySQL日志写入性能。 MySQL日志写入的优化直接影响数据库的性能和稳定性,尤其在高并发或大量写操作场景下。优化重点在于合理配置日志类型、调整刷盘策略、减少不必要的日志开销,并结合硬件提升I/O效率。…

    2026年9月12日
    200
  • mysql如何编写插入数据的insert语句

    编写INSERT语句的核心是安全准确地向表中插入数据,基本语法为INSERT INTO 表名 (列) VALUES (值);可省略列名或使用SET子句,也可通过INSERT … SELECT批量导入;为提升效率,应采用多行VALUES批量插入或LOAD DATA INFILE加载文件;面…

    2026年9月12日
    200
  • ThinkPHP6数据备份与恢复:保护数据的安全

    ThinkPHP6数据备份与恢复:保护数据的安全 在Web应用的开发中,数据的安全是非常重要的一环。当我们的系统面临风险或者需要进行数据迁移的时候,数据备份与恢复就显得尤为重要。ThinkPHP6框架为我们提供了便捷的数据备份与恢复功能,本文将介绍如何利用ThinkPHP6进行数据备份与恢复,以保护…

    2026年9月12日
    000
  • iPhone恢复数据后部分文件损坏怎么办 iPhone恢复数据的完整性校验

    iPhone恢复数据后部分文件损坏怎么办 iPhone恢复数据的完整性校验iPhone恢复数据后部分文件损坏怎么办 iPhone恢复数据的完整性校验iPhone恢复数据后部分文件损坏怎么办 iPhone恢复数据的完整性校验iPhone恢复数据后部分文件损坏怎么办 iPhone恢复数据的完整性校验

    若恢复iPhone数据后文件损坏,可依次尝试:使用易我或风云等修复工具修复特定文件;通过iCloud版本历史回滚至正常状态;用EaseUS或DiskGenius深度扫描并恢复数据;连接电脑执行chkdsk命令修复文件系统错误;最后验证备份完整性并重新创建备份以确保数据无损。 如果您在从备份中恢复iP…

    2026年9月12日 用户投稿
    200
  • Java Stream 实现 CSV 数据合并:城市与国家信息关联

    本文介绍了如何使用 Java Stream API 将从两个 CSV 文件中读取的城市和国家数据进行关联。通过遍历城市列表,并使用 Stream API 在国家列表中查找匹配的国家代码,最终将国家名称添加到对应的城市对象中,保持原始城市列表的顺序。 在实际应用中,我们经常需要从多个数据源(例如 CS…

    2026年9月12日
    000

发表回复

登录后才能评论
关注微信