更多详情请点击查看原文:Python 实战 | 表格中多信息字段的拆分方法(一行变多行)
Python教学专栏,旨在为初学者提供系统、全面的Python编程学习体验。通过逐步讲解Python基础语言和编程逻辑,结合实操案例,让小白也能轻松搞懂Python!
>>>点击此处查看往期Python教学内容
本文目录
一、引言
二、使用 Excel 可以快捷实现吗?
三、Python 的实现方法和代码
四、总结
五、相关推荐
本文共 2743 个字,阅读大约需要 7 分钟,欢迎指正!
Part1引言
如果有一份数据,这份数据中存在一个字段,该字段存储着若干项信息或主体(使用特殊符号分隔)。现在由于需要,我们必须将这份数据从原来的一行数据中某字段包含多条信息拆分为多行,拆分后的每一行中该字段的值都只包含一项信息或主体,就像下面这样。
![图片](https://img-blog.csdnimg.cn/img_convert/22707822f443c1cc7a44915ae669a67b.png)
![图片](https://img-blog.csdnimg.cn/img_convert/10d27ada250e761c605b7b04ba52aadb.png)
本期文章我们和大家分享的就是如何使用 Python 实现上述需求。
Part2 使用 Excel 可以快捷实现吗?
不可以(不使用 VBA 语言,不依赖人工的情况下)。
Excel / WPS 工具支持“分列”,即根据单元格中的特殊标点符号,将一列拆分为多列,但是却不能直接将一行拆分为多行。
Part3 Python 的实现方法和代码
Pandas 库作为 Python 中最有竞争力的数据分析/数据处理工具库,面对这种场景当然没有任何问题。在 Pandas 中,df.explode()
是实现这个需求的核心函数,它的功能正是将一行数据拆分展开为多行,流程如下:
![图片](https://img-blog.csdnimg.cn/img_convert/b26206ee232c2f6fe8e83997984cee89.png)
df.explode(['专利申请人']) # 表格 df 根据字段“专利申请人”进行拆分展开
![图片](https://img-blog.csdnimg.cn/img_convert/323b57b36c00c65b8ff7cd5f595eb564.png)
需要注意的是,拆分前的数据中,表格 df
中的“专利申请人”字段内的值已经被处理为可迭代的列表对象,同时这也是函数df.explode()
起作用的前置条件。通过阅读说明文档发现,该函数仅两个参数,如下表所示:
参数名称 | 参数取值 | 参数说明 |
column | 一个字段名,或者一个包含多个字段名的列表 | 当只根据一个字段进行拆分展开时,直接传入该字段的名称;如果同时需要根据多个字段进行拆分展开,那么可以传入包含这些字段名称的列表。同时,无论传入多少字段名称,都需要保证这些字段中的值必须是字符串类型或者是类似于列表的类型。 |
ignore_index | True、False | 展开后的数据是否重置行索引,默认值为 False,即不重置行索引。 |
通过了解这个函数,我们发现解决问题的关键就是如何将字段中包含多项信息的字符串拆分为列表。在本文演示用的专利申请人数据中,我们可以发现用来分隔不同申请人的符号并不唯一,可能会有多种标点符号,如(,,;;、)等,因此我们可以借助正则函数re.split()
进行一次性拆分,非常方便,代码如下:
# 使用函数将字段“专利申请人”中的值拆分并转换为列表
# re.split() 函数的返回值恰好是列表
df['专利申请人'] = df['专利申请人'].apply(lambda x: re.split('[,;,;、]', x))
# 拆分为列表后再进行展开,并重置展开后数据的行索引
# 注意 df.explode() 会返回一个展开后的结果,而不是修改原始数据
df_ok = df.explode(['专利申请人'], ignore_index=True)
不过,当笔者实际处理专利数据整库(4000w+条数据)时发现,存在一小部分数据不能使用上述方法进行拆分,下图是其中的一种情况。
![图片](https://img-blog.csdnimg.cn/img_convert/4e762e7f8f500c4467079a5216fbe6ab.png)
上图专利申请人字段中虽然包含顿号,但是这些符号都在括号中作为解释说明,显然不应该被拆分为多条。对于这些数据,我们可以先使用特殊的正则表达式将它们识别出来进行单独处理,然后再使用常规的拆分方法处理其他正常的数据即可。以上图为例,如何识别括号中包含标点符号的数据呢?我们可以使用下面的正则表达式来筛选。
# 先读取全部数据,此处为 1000 条样例数据
df = pd.read_excel('专利申请人1000条样例数据.xlsx')
# 筛选出需要特殊处理的数据(分隔符出现在括号中的数据)
df_special = df[df['专利申请人'].str.contains\
('(?:\(|()[^\(\)()]*?[,;,;、][^\(\)()]*?(?:\)|))')]
![图片](https://img-blog.csdnimg.cn/img_convert/3fc299180e827ad69e152ff673683c05.png)
正则表达式'(?:\(|()[^\(\)()]*?[,;,;、][^\(\)()]*?(?:\)|))'
看起来比较复杂,但拆分看的话并不难理解,下面我们来做一个解析。上述正则表达式可以按顺序拆分为五个部分,每个部分的含义如下表所示。
正则表达式 | 含义(匹配的内容) |
| 匹配一个左半边括号‘(’ 或 ‘(’ |
| 匹配若干个任意字符,这些字符不可以是括号符 |
| 匹配一个出现在中括号中的标点符号 |
| 匹配若干个任意字符,这些字符不可以是括号符 |
| 匹配一个右半边括号‘)’ 或 ‘)’ |
那么拼合起来的含义就是,匹配一对括号符以及其中包含的所有字符,并要求括号中出现了指定的标点符号,且标点符号的两边还可以出现若干个字符,也就是说,即使括号中出现了不止一个指定的标点符号,那么也可以成功匹配到。如果你想回顾正则表达式的用法,可点击以下文章查看:
筛选完成后就可以单独处理筛选出来的数据 df_special
了,这里不再详细说明如何处理。那么后续再将单独处理的 df_special
从全量数据 df
中删除,最后再使用常规办法处理最后剩余的数据就可以了,下面是处理样例数据的全部代码。
import re,os
import pandas as pd
# 读取样例数据
df = pd.read_excel('./外发样例数据1000/专利申请人1000条样例数据.xlsx').fillna('')
# 筛选出需要单独处理的数据
df_special = df[df['专利申请人'].str.contains\
('(?:\(|()[^\(\)()]*?[,;,;、][^\(\)()]*?(?:\)|))')]
# 保存单独处理后的数据,处理过程省略
df_special.to_csv('展开后的数据.csv', # 写入的文件路径
index=False, # 不写入数据行索引
quoting=1, # 添加封闭符
encoding='utf-8', # 设置写入文件的编码
mode='a', # 设置为追加写入模式
header=not os.path.exists('展开后的数据.csv') # 仅首次写入时才会写入表头
)
# 从全量数据中删除特殊处理的数据
df = df.drop(df_special.index)
# 最后处理剩余的数据
# 1. 字段值根据指定的标点符号拆分为列表
df['专利申请人'] = df['专利申请人'].apply(lambda x: re.split('[,;,;]', x))
# 2. 展开拆分后的数据
df_explode = df.explode(['专利申请人'], ignore_index=True)
# 写入处理后的剩余数据
df_explode.to_csv('展开后的数据.csv', # 写入的文件路径
index=False, # 不写入数据行索引
quoting=1, # 添加封闭符
encoding='utf-8', # 设置写入文件的编码
mode='a', # 设置为追加写入模式
header=not os.path.exists('展开后的数据.csv') # 仅首次写入时才会写入表头
)
Part4 总结
本期文章介绍了一种使用 Python 将表格数据进行纵向拆分展开的方法,本文演示用的样例数据为专利数据中的专利申请号、专利申请人。如果您也需要经常接触数据,那么希望本期的数据处理实战经验能为您提供帮助,或者带来灵感。
👉如需获取本文演示代码以及演示所用数据请查看原文:Python 实战 | 表格中多信息字段的拆分方法(一行变多行)。
Part5 相关推荐
Python 教学
• Python 教学 | 学习 Python 第一步——环境安装与配置
• Python 教学 | Python 中的分支结构(判断语句)
• Python 教学 | Python 中的循环结构(上)
• Python 教学 | Python 中的循环结构(下)
• Python 教学 | 盘点 Python 数据处理常用标准库
• Python 教学 | “小白”友好型正则表达式教学(一)
• Python 教学 | “小白”友好型正则表达式教学(二)
• Python 教学 | “小白”友好型正则表达式教学(三)
• Python 教学 | 数据处理必备工具之 Pandas(基础篇)
• Python 教学 | 数据处理必备工具之 Pandas(数据的读取与导出)
• Python 教学 | Pandas 数据索引与数据选取
• Python 教学 | Pandas 妙不可言的条件数据筛选
• Python 教学 | Pandas 缺失值与重复值的处理方法
• Python 教学 | Pandas 表格字段类型精讲(含类型转换)
• Python 教学 | Pandas 数据合并(含目录文件合并案例)
• Python 教学 | Pandas 数据匹配(含实操案例)
• Python 教学 | Pandas 函数应用(apply/map)【上】
• Python 教学 | Pandas 函数应用(apply/map)【下】
• Python 教学 | Pandas 分组聚合与数据排序
• Python 教学 | 一文搞懂面向对象中的“类和实例”
• Python 教学 | Python 学习路线+经验分享,新手必看!
• Python 教学 | 解密 Windows 中的 Path 环境变量
• Python 教学 | Jupyter Notebook 中那些十分有用的魔术命令
Python实战
• Python实战 | 如何使用 Python 调用 API
• 数据治理 | 从“今天中午吃什么”中学习Python文本相似度计算
• 数据治理 | 省下一个亿!一文读懂如何用python读取并处理PDF中的表格(赠送本文所用的PDF文件)
• 数据治理 | 还在人工识别表格呢?Python 调用百度 OCR API 又快又准
• 数据治理 | 如何用 Python 批量压缩/解压缩文件
• 案例分享:使用 Python 批量处理统计年鉴数据(上)
• 案例分享:使用 Python 批量处理统计年鉴数据(下)
• Python 实战 | ChatGPT + Python 实现全自动数据处理/可视化
• ChatGPT在指尖跳舞: open-interpreter实现本地数据采集、处理一条龙
• Python 实战 | 进阶中文分词之 HanLP 词典分词(上)
• Python 实战 | 进阶中文分词之 HanLP 词典分词(下)
• Python实战 | 文本文件编码问题的 Python 解决方案
• Python 实战 | 从 PDF 中提取(框线不全的)表格
• Python 实战 | 利用 Python 做长宽面板转换(附数据&代码)
• Python 实战 | 拆分、合并、转换……请查收这份 PDF 操作手册
• 答疑解惑 | 云桌面用户如何使用 Python 连接数据库读写、处理数据
• Python 实战 | 使用 Python 清洗文本字段中的 HTML 代码
• 答疑解惑 | csv 数据字段错位?导入 Stata 中途报错?到底怎么解决……
数据可视化
• 数据可视化 | 讲究!用 Python 制作词云图学问多着呢
• 数据可视化 | 地址数据可视化—教你如何绘制地理散点图和热力图
• 数据可视化 | 太酷了!用 Python 绘制3D地理分布图
• 数据可视化 | 用 Python 制作动感十足的动态柱状图