将 pandas 数据框中的单元格拆分为多行

2024-02-18

我有一个包含订单数据的数据框,每个订单都有多个包存储为逗号分隔的字符串 [package & package_code] 列

我想拆分包裹数据并为每个包裹创建一行,包括其订单详细信息

这是一个示例输入数据框:

import pandas as pd
df = pd.DataFrame({"order_id":[1,3,7],"order_date":["20/5/2018","22/5/2018","23/5/2018"], "package":["p1,p2,p3","p4","p5,p6"],"package_code":["#111,#222,#333","#444","#555,#666"]})

And this is what I am trying to achieve as output: Output

我怎样才能用熊猫做到这一点?


熊猫 >= 0.25

假设所有可拆分列具有相同数量的逗号分隔项,您可以按逗号拆分,然后使用Series.explode https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.explode.html在每列上:

(df.set_index(['order_id', 'order_date'])
   .apply(lambda x: x.str.split(',').explode())
   .reset_index())                                                   

   order_id order_date package package_code
0         1  20/5/2018      p1         #111
1         1  20/5/2018      p2         #222
2         1  20/5/2018      p3         #333
3         3  22/5/2018      p4         #444
4         7  23/5/2018      p5         #555
5         7  23/5/2018      p6         #666

Details

将不被触及的列设置为索引,

df.set_index(['order_id', 'order_date'])

                      package    package_code
order_id order_date                          
1        20/5/2018   p1,p2,p3  #111,#222,#333
3        22/5/2018         p4            #444
7        23/5/2018      p5,p6       #555,#666

下一步是一个两步过程:用逗号分割以获取一列列表,然后调用explode将列表值分解为各自的行。

_.apply(lambda x: x.str.split(',').explode())

                    package package_code
order_id order_date                     
1        20/5/2018       p1         #111
         20/5/2018       p2         #222
         20/5/2018       p3         #333
3        22/5/2018       p4         #444
7        23/5/2018       p5         #555
         23/5/2018       p6         #666

最后,重置索引。

_.reset_index()

   order_id order_date package package_code
0         1  20/5/2018      p1         #111
1         1  20/5/2018      p2         #222
2         1  20/5/2018      p3         #333
3         3  22/5/2018      p4         #444
4         7  23/5/2018      p5         #555
5         7  23/5/2018      p6         #666

熊猫

这应该适用于任何数量的这样的列。其本质是一个小小的堆栈拆栈魔法str.split.

(df.set_index(['order_date', 'order_id'])
   .stack()
   .str.split(',', expand=True)
   .stack()
   .unstack(-2)
   .reset_index(-1, drop=True)
   .reset_index()
)

  order_date  order_id package package_code
0  20/5/2018         1      p1         #111
1  20/5/2018         1      p2         #222
2  20/5/2018         1      p3         #333
3  22/5/2018         3      p4         #444
4  23/5/2018         7      p5         #555
5  23/5/2018         7      p6         #666

还有另一种高性能替代方案涉及chain,但是您需要显式链接并重复每一列(对于很多列来说有点问题)。选择最适合您的问题描述的内容,因为没有单一的答案。

Details

首先,将不被触及的列设置为索引。

df.set_index(['order_date', 'order_id'])
 
                      package    package_code
order_date order_id                          
20/5/2018  1         p1,p2,p3  #111,#222,#333
22/5/2018  3               p4            #444
23/5/2018  7            p5,p6       #555,#666

Next, stack行。

_.stack()

order_date  order_id              
20/5/2018   1         package               p1,p2,p3
                      package_code    #111,#222,#333
22/5/2018   3         package                     p4
                      package_code              #444
23/5/2018   7         package                  p5,p6
                      package_code         #555,#666
dtype: object

我们现在有一个系列。所以打电话str.split在逗号上。

_.str.split(',', expand=True)

                                     0     1     2
order_date order_id                               
20/5/2018  1        package         p1    p2    p3
                    package_code  #111  #222  #333
22/5/2018  3        package         p4  None  None
                    package_code  #444  None  None
23/5/2018  7        package         p5    p6  None
                    package_code  #555  #666  None

我们需要去掉 NULL 值,所以调用stack again.

_.stack()

order_date  order_id                 
20/5/2018   1         package       0      p1
                                    1      p2
                                    2      p3
                      package_code  0    #111
                                    1    #222
                                    2    #333
22/5/2018   3         package       0      p4
                      package_code  0    #444
23/5/2018   7         package       0      p5
                                    1      p6
                      package_code  0    #555
                                    1    #666
dtype: object

我们快到了。现在我们希望索引的倒数第二层成为我们的列,因此使用 unstackunstack(-2) (unstack在倒数第二层)

_.unstack(-2)

                      package package_code
order_date order_id                       
20/5/2018  1        0      p1         #111
                    1      p2         #222
                    2      p3         #333
22/5/2018  3        0      p4         #444
23/5/2018  7        0      p5         #555
                    1      p6         #666

使用摆脱多余的最后一级reset_index:

_.reset_index(-1, drop=True)

                    package package_code
order_date order_id                     
20/5/2018  1             p1         #111
           1             p2         #222
           1             p3         #333
22/5/2018  3             p4         #444
23/5/2018  7             p5         #555
           7             p6         #666

最后,

_.reset_index()

  order_date  order_id package package_code
0  20/5/2018         1      p1         #111
1  20/5/2018         1      p2         #222
2  20/5/2018         1      p3         #333
3  22/5/2018         3      p4         #444
4  23/5/2018         7      p5         #555
5  23/5/2018         7      p6         #666
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 pandas 数据框中的单元格拆分为多行 的相关文章

  • 使用特定的类/函数预加载 Jupyter Notebook

    我想预加载一个笔记本 其中包含我在另一个文件中定义的特定类 函数 更具体地说 我想用 python 来做到这一点 比如加载一个配置文件 包含所有相关的类 函数 目前 我正在使用 python 生成笔记本并在服务器上自动启动它们 因为不同的
  • 在 django ORM 中查询时如何将 char 转换为整数?

    最近开始使用 Django ORM 我想执行这个查询 select student id from students where student id like 97318 order by CAST student id as UNSIG
  • 安装了 32 位的 Python,显示为 64 位

    我需要运行 32 位版本的 Python 我认为这就是我在我的机器上运行的 因为这是我下载的安装程序 当我重新运行安装程序时 它会将当前安装的 Python 版本称为 Python 3 5 32 位 然而当我跑步时platform arch
  • 需要在python中找到print或printf的源代码[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在做一些我不能完全谈论的事情 我
  • 跟踪 pypi 依赖项 - 谁在使用我的包

    无论如何 是否可以通过 pip 或 PyPi 来识别哪些项目 在 Pypi 上发布 可能正在使用我的包 也在 PyPi 上发布 我想确定每个包的用户群以及可能尝试积极与他们互动 预先感谢您的任何答案 即使我想做的事情是不可能的 这实际上是不
  • 删除flask中的一对一关系

    我目前正在使用 Flask 开发一个应用程序 并且在删除一对一关系中的项目时遇到了一个大问题 我的模型中有以下结构 class User db Model tablename user user id db Column db String
  • 使用Python请求登录Google帐户

    在多个登录页面上 需要谷歌登录才能继续 我想用requestspython 中的库以便让我自己登录 通常这很容易使用requests库 但是我无法让它工作 我不确定这是否是由于 Google 做出的一些限制 也许我需要使用他们的 API 或
  • 使用 xlrd 打开 BytesIO (xlsx)

    我正在使用 Django 需要读取上传的 xlsx 文件的工作表和单元格 使用 xlrd 应该可以 但因为文件必须保留在内存中并且可能不会保存到我不知道如何继续的位置 本例中的起点是一个带有上传输入和提交按钮的网页 提交后 文件被捕获req
  • 如何在 Python 中解析和比较 ISO 8601 持续时间? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 Python v2 库 它允许我解析和比较 ISO 8601 持续时间may处于不同单
  • Python,将函数的输出重定向到文件中

    我正在尝试将函数的输出存储到Python中的文件中 我想做的是这样的 def test print This is a Test file open Log a file write test file close 但是当我这样做时 我收到
  • 在 Sphinx 文档中*仅*显示文档字符串?

    Sphinx有一个功能叫做automethod从方法的文档字符串中提取文档并将其嵌入到文档中 但它不仅嵌入了文档字符串 还嵌入了方法签名 名称 参数 我如何嵌入only文档字符串 不包括方法签名 ref http www sphinx do
  • 如何通过 TLS 1.2 运行 django runserver

    我正在本地 Mac OS X 机器上测试 Stripe 订单 我正在实现这段代码 stripe api key settings STRIPE SECRET order stripe Order create currency usd em
  • pip 列出活动 virtualenv 中的全局包

    将 pip 从 1 4 x 升级到 1 5 后pip freeze输出我的全局安装 系统 软件包的列表 而不是我的 virtualenv 中安装的软件包的列表 我尝试再次降级到 1 4 但这并不能解决我的问题 这有点类似于这个问题 http
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • import matplotlib.pyplot 给出 AttributeError: 'NoneType' 对象没有属性 'is_interactive'

    我尝试在 Pycharm 控制台中导入 matplotlib pyplt import matplotlib pyplot as plt 然后作为回报我得到 Traceback most recent call last File D Pr
  • 仅第一个加载的 Django 站点有效

    我最近向 stackoverflow 提交了一个问题 标题为使用mod wsgi在apache上多次请求后Django无限加载 https stackoverflow com questions 71705909 django infini
  • Python:XML 内所有标签名称中的字符串替换(将连字符替换为下划线)

    我有一个格式不太好的 XML 标签名称内有连字符 我想用下划线替换它 以便能够与 lxml objectify 一起使用 我想替换所有标签名称 包括嵌套的子标签 示例 XML
  • Pandas 每周计算重复值

    我有一个Dataframe包含按周分组的日期和 ID df date id 2022 02 07 1 3 5 4 2022 02 14 2 1 3 2022 02 21 9 10 1 2022 05 16 我想计算每周有多少 id 与上周重
  • cv2.VideoWriter:请求一个元组作为 Size 参数,然后拒绝它

    我正在使用 OpenCV 4 0 和 Python 3 7 创建延时视频 构造 VideoWriter 对象时 文档表示 Size 参数应该是一个元组 当我给它一个元组时 它拒绝它 当我尝试用其他东西替换它时 它不会接受它 因为它说参数不是
  • 使用 z = f(x, y) 形式的 B 样条方法来拟合 z = f(x)

    作为一个潜在的解决方案这个问题 https stackoverflow com questions 76476327 how to avoid creating many binary switching variables in gekk

随机推荐

  • hibernate 可选连接 - 需要以任何方式返回连接列值

    作为后续休眠可选连接 http stackoverflow com questions 5231579 hibernate optional join 系统中的许多现有查询依赖于 EntityOne 和 EntityTwo 之间的映射关系
  • docker 构建 Dockerfile 时允许更多内存

    我尝试构建一个 Dockerfile 并得到以下结果 Linking CXX executable bin clang collect2 error ld terminated with signal 9 Killed make 2 bin
  • QT 5.5.1 .so 库与 android

    我已经下载了用于 armeabi 和 x86 android 平台的 openssl 编译库here https github com emileb OpenSSL for Android Prebuilt并尝试将其加载到 pro 文件中
  • 查找 PHP 依赖项

    有没有可以列出 PHP 文件使用的类名称的工具 例如 如果我在此文件上运行它 它将报告 Obj1 和 Obj2 如果它真的很聪明 它也可能会报告 Obj3 但这不是必需的 我正在尝试打包一些代码 并且需要一些帮助以确保我没有错过任何依赖项
  • 从 Visual Studio 2017 部署 Angular 2 应用程序

    我使用 Visual Studio 2017 并开发了两个 Angular 2 应用程序 第一个是纯 Angular 2 没有后端代码 数据来自 wcf 服务 第二个是托管在 MVC 应用程序 net 4 6 中的 Angular 2 SP
  • 创建具有两行文本的自定义按钮,每行文本具有不同的字体

    我有点被困在这里 真的需要一些帮助 在我看来 向按钮添加两行单独的文本应该很容易 但事实并非如此 有一种方法可以使用 html 标签来做到这一点 但它不允许您指定 大 和 小 之外的字体或文本大小 这是我的按钮 它被称为 clicky
  • Spring Data Redis Lettuce 连接问题

    我有带有 MYSQL DB 的 Spring Boot 应用程序 并且我使用 Cacheable Annotation 将数据缓存在服务器层的 Redis 中 Cacheable value employeeCache key custom
  • 遗传算法 - 路径的交叉和变异算子

    我想知道是否有人知道图中路径的直观交叉和变异运算符 谢谢 问题有点老了 但问题似乎没有过时或解决 所以我认为我的研究仍然可能对某人有帮助 就 TSP 问题而言 突变和交叉是相当微不足道的 在最短路径或最优的情况下 每个突变都是有效的 即因为
  • Matplotlib 将文件保存为 JPEG 编码器错误

    我试图将 matplotlib 图保存为 JPEG 文件 但出现以下错误 我不确定这是否与我的安装或我的代码有关 因此我还附加了一个示例程序来执行该程序 该程序会产生以下错误 我将图形保存为 png 或 pdf 没有问题 只有 jpg 存在
  • 在 php 中访问 joomla 会话 - codeigniter

    我需要检查用户是否已登录 CodeIgniter 登录发生在 Joomla 网站上 我尝试了以下方法来初始化 joomla define JEXEC 1 define DS DIRECTORY SEPARATOR define JPATH
  • ... 操作员的名字是什么?

    Is the 运算符 扩展 运算符 根据其词法位置 参数位置与解构赋值 数组 参数位置等 具有两种不同的语义 或者它有两个名字 传播 和 休息 吗 这是同一个运算符 根据用途不同 名称也不同 其余属性 其余属性收集尚未被解构模式拾取的剩余自
  • React 中的 TextField 内无法识别新行 '\n'

    Context 我正在使用 Material UI TextField 并映射从数据库 MongoDB 获取的对象数组 就像是 state map item gt
  • 当模块导入 Angular 时,如何自动运行模块中的服务?

    我想知道在导入模块时如何从模块运行服务而无需任何手动服务注入并运行 就像RouterModule does NgModule imports BroserModule MyModuleWithServicesThatShouldAutoRu
  • .NET 正则表达式 - 创建字符串?

    我有一个正则表达式 用于提取文件夹名称的两个部分 0 9 8 0 9A Ba c BLAH 没问题 这将匹配 12345678 abc BLAH 我有 12345678 和 abc 分为两组 是否可以通过提供带有两个字符串的方法并将它们插入
  • Artifactory 失去了对当地文物的追踪

    我正在使用 Artifactory OSS 4 1 0 和 Java 1 8 0 51 当我尝试从 Artifactory Web 界面下载本地工件之一时 我得到以下信息 errors status 500 message Could no
  • Easy_install 没有安装 Mechanize?

    我正在从旧的 Win2K 机器迁移到新的 功能更强大的 Vista 64 位 PC 大部分迁移都进行得相当顺利 但我确实发现我需要重新安装所有与 Python 相关的工具 我已经下载了 mechanize 0 1 11 tar gz 文件并
  • 在 Matlab 中使用 svmtrain 内存不足

    我有一组数据正在尝试使用 SVM 来学习 对于上下文 数据的维数为 35 包含大约 30 000 个数据点 我之前用这个数据集在 Matlab 中训练过决策树 大约花了 20 秒 由于对错误率不太满意 我决定尝试 SVM 我第一次尝试svm
  • MySql 中的 EntityFunctions 支持

    我在 MySQL 中使用 EntityFunctions DiffMinutes 时遇到错误 下面是我的代码 return db DiscoveredDevices Where m gt EntityFunctions DiffMinute
  • 哪个 Hook 可以更改 WooCommerce 购物车页面中的数量更新?

    当购物车中的产品数量发生变化时 我试图触发一个功能 更具体地说 我想在客户修改购物车中的金额时运行此功能 我正在寻找购物车中剩余的金额 然后拦截更新购物车事件 目前我正在使用 add action woocommerce remove ca
  • 将 pandas 数据框中的单元格拆分为多行

    我有一个包含订单数据的数据框 每个订单都有多个包存储为逗号分隔的字符串 package package code 列 我想拆分包裹数据并为每个包裹创建一行 包括其订单详细信息 这是一个示例输入数据框 import pandas as pd