bootstraptable 删除指定多行_Python Pandas处理Excel多列到多行转换

2023-10-30

Excel能够实现的功能,目前Pandas都能够实现。倘若你已经能够熟练运用Pandas的"宽转长" wide_to_long()和透视表pivot_table()函数,建议您直接跳过本文。

需求说明

需求是将材料变更的多列记录数据转成多行,演示数据如下图:

演示数据

这是一些材料(P/N)更换供应商时,供应商(Supplier)和供应商料号(Supplier PN)变更记录表。从表中可以看出Supplier和Supplier PN是成对循环出现,每颗材料的变更次数都可能不同,有些材料变更可能多达20次,有些可能仅有1次。另外因为某些原因,一些变更只记录了Supplier信息,未记录Supplier PN。同样也存在相反的情况,即记录了Supplier PN但未记录Supplier。

本文要实现两个需求,它们分别是:

1,填充未记录的Supplier和Supplier PN 为NOT CLEAR,但Supplier和Supplier PN 都为空值则不填充,如下图:

填充NOT CLEAR

2,将同一材料变更记录的多列数据转换成多行数据,即每行只记录一次变更数据,效果如下图:

实现多行转换效果

◆ 读取Excel文件

sample_df = pd.read_excel(r'/users/dongdong/downloads/demo_data.xlsx',sheet_name='sample')
sample_df

下图中发现为了便于区分各列,Pandas已经自动将第2组和第3组的Supplier 和Supplier PN后加上了.数字

列名自动区分

◆ 处理列名

要想使用wide_to_long()方法,我们需要将要转换的列名格式处理成一致,即将第一组的Supplier和Supplier PN`变成Supplier.0以及Supplier PN.0

sample_df.columns = np.where(sample_df.columns.str.match('^Supp.*D+$'),
                      sample_df.columns + '.0',
                      sample_df.columns)

这里用到了numpy.where(condition,[x, y])和正则表达式match(),前者是基于条件condition,返回值来自x或者y。上面代码主要将不含有.的列名加上.0,含有的保持不变。当然也通过直接暴力修改列名的方式实现:

sample_df.rename(columns={'Supplier':'Supplier.0','Supplier PN':'Supplier PN.0'},inplace=True)

注意列名的变化

◆ wide_to_long()函数

Pandas有这样的一个函数,个人姑且称其为“宽到长格式”,详见使用文档。对于存根名称['A','B'],此函数希望查找格式为A-suffix1,A-suffix2…,B-suffix1,B-suffix2等的一组或多组列。显然我们的数据列名Supplier.0 Supplier.1 Supplier.2 和Supplier PN.0 Supplier PN.1 Supplier PN.2符合此规则。wide_to_long()基本语法如下:

pd.wide_to_long(df, stubnames(提取以指定字符串开头的列),
                   i(用作索引的列),
                   j(提取开头后剩余的部分会成一列,在此指定列名),
                   sep(分隔符),
                   suffix(捕获正则表达式匹配的后缀)
)

根据上面的基本语法,我们可实现下列代码:

unpivotted_df = (pd.wide_to_long(sample_df,
                 stubnames = ['Supplier','Supplier PN'],
                 i = ['P/N','Description'],
                 j = 'idx',
                 sep='.'))

来看下效果,idx列是Supplier.0,Supplier.1 …… ‘.’号后面的数字部分:

使用wide_to_long函数后效果

◆ NaN个数判断

接着对每行进行判断,判断条件是每行只有1个不为空NaN,eq(1) = 1。

cond = unpivotted_df.notna().sum(axis = 1).eq(1)
cond

注意只有2行为True, 它们就是需要填充‘NOT CLEAR’的行。

判断结果

◆ 填充NOT CLEAR

根据判断结果,对指定的cell进行填充:

unpivotted_df[:]=np.where(cond[:,None],unpivotted_df.fillna('NOT CLEAR'),unpivotted_df)
unpivotted_df

[:,None],None表示该维不进行切片,将该维整体作为数组元素处理,即维数+1。

填充后的效果

◆ 填充后恢复到多列

如果需要恢复到原来多列样式,我们可以使用如下代码,这里有个`unstack()`函数,值得研究。

out = unpivotted_df.unstack().sort_index(level=1,axis=1).reindex(df[['P/N','Description']])
out.columns=out.columns.map('{0[0]}.{0[1]}'.format) 
out.reset_index()

修改后效果

◆ 删除idx列

为实现本文最终目的,其实我们并不需要将其恢复到原来样式,在此只为了说明相关函数。我们还是在填充后的效果图基础上说明:

沿用之前填充后的效果

删除包含空值的行,重新设置index,最后删掉多余的列idx,如此即可得到我们想要的结果。

unpivotted_df.dropna().reset_index().drop('idx',axis=1)

最终实现的效果

◆ 完整代码

sample_df = pd.read_excel(r'/users/dongdong/downloads/demo_data.xlsx',sheet_name='data')
sample_df.columns = np.where(sample_df.columns.str.match('^Supp.*D+$'),
                      sample_df.columns + '.0',
                      sample_df.columns)
unpivotted_df = (pd.wide_to_long(sample_df,
                 stubnames = ['Supplier','Supplier PN'],
                 i = ['P/N','Description'],
                 j = 'idx',
                 sep='.'))
cond = unpivotted_df.notna().sum(1).eq(1)
unpivotted_df[:]=np.where(cond[:,None],unpivotted_df.fillna('NOT CLEAR'),unpivotted_df)
out = unpivotted_df.dropna().reset_index().drop('idx',axis=1)
out.to_excel('columns_to_rows.xlsx')

◆ 另一种处理方法

还可以使用Pandas melt()pivot_table()完成多列到多行的转行,前提是已经进行了填充。相关示例如下:

另外一种方法demo数据
(df.melt(['P/N','Description']).dropna()
           .assign(stub=lambda x: x.variable.str.extract('([^.]*).?'),
                   idx=lambda x: x.groupby('stub').cumcount())
           .pivot_table(index=['P/N','Description','idx'], 
                columns='stub', 
                values='value',
                aggfunc='first').reset_index().drop('idx', axis=1))
)

另外一种方法转化结果
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

bootstraptable 删除指定多行_Python Pandas处理Excel多列到多行转换 的相关文章

  • 《Python进阶系列》一:使用Python包组织代码

    使用Python包 package 组织代码 最近在看 Python入门技能树 时 看到了Python包组织代码觉得很有意思 特地写个笔记总结一下 quad Python 通过包 package 的方式来组织代码 包是一种特殊的模块 mod
  • vue3-ElmentPlus封装通用表格-含单元格操作-多选-分页器

    Sam9029的CSDN博客主页 Sam9029的博客 CSDN博客 JS学习 CSS学习 Vue 2领域博主 恭喜你 若此文你认为写的不错 不要吝啬你的赞扬 求收藏 求评论 求一个大大的赞 已经有很久没有写文章了 贪玩 摆烂 不想动 低情
  • GAN初识

    1 生成对抗网络GAN简介 1 1 生成器 G Z 接受随机噪声Z作为输入生成仿品 并训练自己去欺骗判别器D 让D以为G Z 产生的任何数据都是真实的 1 2 判别器 D Y 可以基于真品和仿品来判断仿造品的仿真程度 通常值越靠近0表示越真
  • 数字信号处理理解

    心得体会 给自己看的 傅里叶变换 FT FS DTFT DFS 傅里叶变换虚部理解 每个函数都可以写成奇分量 偶分量 偶分量用很多cos合成 奇分量用很多sin合成 频谱上 实轴上冲激函数就是由这些cos合成 那如果是sin合成的呢 那就是
  • mkdocs 编辑及启动

    mkdocs 编辑及启动 新建项目以及 md 文件之后 如图 具体代码为 mkdocs 核心配置代码 编写完成之后 编译 cd mkdocs docs make html 成功之后 会自动生成 build文件 启动 firefox buil
  • elementUI中的el-form常用校验规则

    elementUI中的el form常用校验规则 校验使用方式 rules name required true message 请输入活动名称 trigger blur min 3 max 5 message 长度在 3 到 5 个字符
  • 【PTA】跟奥巴马一起画方块

    美国总统奥巴马不仅呼吁所有人都学习编程 甚至以身作则编写代码 成为美国历史上首位编写计算机代码的总统 2014年底 为庆祝 计算机科学教育周 正式启动 奥巴马编写了很简单的计算机代码 在屏幕上画一个正方形 现在你也跟他一起画吧 输入格式 输
  • 【计算机视觉

    文章目录 一 检测相关 5篇 1 1 Detecting Manufacturing Defects in PCBs via Data Centric Machine Learning on Solder Paste Inspection
  • docker部署nginx时,proxy_pass填localhost报错502

    文章目录 docker部署nginx时 proxy pass填localhost报错502 原因 参考链接 https blog csdn net qq 38623939 article details 129582950 docker部署
  • iar如何生成hex文件

    生成方法如下 1 工具需求 1 iar平台 2 第一种方法 首先在工程选项options里面 选中output converter选项 接着勾中Generate additional output选项 1 然后在Output format
  • nagios发送邮件命令配置

    define command command name notify by email command line usr bin printf b Nagios n nNotification Type NOTIFICATIONTYPE n
  • Bootstrap-table动态新增行,删除行,可编辑

    Bootstrap table动态新增行 删除行 可编辑 效果图 html div class table box style margin 20px div a 添加行 a a 删除行 a div table table div js
  • 区块链技术在网络安全中的应用

    区块链是一个现代的数字分类账本 不仅记录货币交易 还可以记录任何有价值的东西 输入的数字数据在Blockchain上作为相互共享的和永久记录的数据库 利用系统本身去中心化的特性具有明显的优势 区块链数据库不存储在集中位置 这意味着记录确实是
  • 深度学习结合非局部均值滤波的图像去噪算法

    其实这是半年之前完成的内容 一直懒着没有总结 今天看了看代码 发觉再不总结自己以后都看不懂了 故整理如下 非局部均值是一种基于块匹配来确定滤波权值的 即先确定一个块的大小 例如7x7 然后在确定一个搜索区域 例如15x15 在15x15这个
  • hexo提交报错 unable to access ‘https://github.com/*/*.github.io.git/‘: Couldn‘t resolve host ‘github.com

    title gt hexo提交报错 unable to access https github com github io git Couldn t resolve host github com date 2016 10 08 19 08
  • 算法题 十 之 无向连接图的深度拷贝

    题目 无向连接图的深度拷贝 图的表示方式 用数组表示与当前节点连接的节点 如下面的代码 class Node public int val public List
  • mac下安装brew遇到的问题总结

    网上的例子大多数给的下载地址已经过期了 github上的地址也已经变了 执行的ruby命令需要去http brew sh 官网上看 usr bin ruby e curl fsSL https raw githubusercontent c
  • Openssl 签名证书学习笔记

    环境 win10 64位 安装版的OpenSSL Win64 openssl 1 1 0f x509证书 环境变量配置openssl 的path 操作在命令窗口完成 第一类 自签名证书 自签名证书 比一般过程 1 生成密钥 2 生成请求 3
  • Unity RawImage加载Image到底在什么时候用哪一种方法

    先看看 RawImage加载Image的区别 RawImage核心代码比Image少很多 Raw Image不支持交互 可用于显示任何图片而不仅仅是Sprite 一般用在背景 图标上 支持UV Rect 用来设置只显示图片的某一部分 而Im

随机推荐