作者简介
HeoiJin:立志透过数据看清世界的产品策划,专注爬虫、数据分析、产品策划领域。
万物皆营销 | 资本永不眠 | 数据恒真理
CSDN:https://me.csdn.net/weixin_40679090
目录
一、前言
最近收到一个小朋友(无中生友)发过来的需求,要将多列数据转化成多行数据,并提取指定列的数据。但因为数据结构有点丑,而且数据量大,不好通过excel公式进行清洗,希望我利用python帮他清洗下。那么这位小朋友碰上了什么幺蛾子,接下来一起一探究竟吧。
二、项目准备
- 语言:Python 3.7
- IDE:Pycharm
- 相关库:Pandas、re、xlrd、xlwt
三、项目特色
- 利用ExcelFile方法读取单个Excel文件中的多个sheets
- 利用explode方法为dataframe中嵌套的列表解嵌套为多行数据
四、项目需求
拿到样本数据和最终效果图的那一刻,有句话想跟设计表格的大佬说,不知当讲不当讲…各位先品一品这堆数据。
吐槽归吐槽,金牌厨师胖大师表示:“这波问题不大,接下来我要展示我王者水平的操作!”
五、核心厨具介绍
pandas.DateFrame.explode能将dataframe的嵌套列表拆分成多行,并会复制同一行的其他元素。
方法 | 参数详解 |
---|---|
DataFrame.explode(self, column: Union[str, Tuple]) → ‘DataFrame’ | column:要进行操作的列名,可以传入字符串或者元组; 注意列名应该是唯一的,否则会引发ValueError; 返回dataframe(如果整个dataframe仅有一列,会自动在转换为series) |
六、烹饪开始
6.1 确认烹饪思路
- 遍历所有sheet
- 筛选出核心的房号、姓名、电话信息
- 将信息拼接成为列表
- 将列表拆分为多行数据
- 输出为csv
6.2 筛选核心食材(获取特定的columns)
观察可知,三个sheets的表头顺序都不一样,如果只利用简单粗暴的切片方式,并不能精准地获取到需要的表头。但庆幸表头名称都相同,派出正则表达式这把利刃便能轻松地完成任务。
def get_new_columns(df):
'''
>> 利用正则匹配出目标columns
>> df.columns=['栋数', '户型', '姓名', '性别', '电话', '房号', '姓名.1', '性别.1', '电话.1', '房号.1','姓名.2', '性别.2', '电话.2', '房号.2']
>> 当我们的columns重复的时候,pandas会自动帮我们在重复的columns后面加上.编号。
:param df:
:return:
'''
# 提取columns对应的字段
pattern_name=r',(姓名.?\d?),'
pattern_room=r',(房号.?\d?),'
pattern_phoone=r',(电话.?\d?),'