最新Python 利用pandas包完成excel数据的转置操作_pandas转置表格,一线大厂面试题

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

导入xlsx使用的是pd.read_excel()

需要注意的是pandas导入xlsx使用的是xlrd包,而只有旧版本的xlrd(1.2.0) 包支持导入xlsx文件,最新版本的xlrd包不支持xlsx而支持xls。

import pandas as pd
df_raw = pd.read_excel(r'XXXXX\practice.xlsx')

观察数据

导入数据之后,需要根据数据呈现出的格式进行相应的操作。
图1
可以看出:

  1. excel中作为列信息的店铺在读取之后变成了行信息;
  2. 合并的单元格被拆分,并且拆分后只有一个单元格有信息。

处理思路及代码

  1. 将产品类别和产品质量字段设置为index,然后设置店铺等级和店铺为多层级columns;
  2. 使用stack()对表格进行转置操作,此时多层次的columns也变为了index;
  3. 使用reset_index()将index恢复为列即完成。

第一步:

from collections import OrderedDict #该包用于生成去重并且顺序不变的列名列表
def remove\_duplicates(lst):#定义列表去重并不改变顺序的函数
    return list(OrderedDict.fromkeys(lst))

df = df_raw.copy()
df.fillna(method = 'ffill',inplace = True)
#生成第二层级的列名列表
col_index = remove_duplicates(df.iloc[0,:][df.iloc[0,:].notna()].to_list())
#删除第一行
df = df.drop(0,axis = 0)
#set\_index
df = df.set_index(['产品类别','产品质量'])
#添加columns index
col_index2 = [x for x in df.columns.to_list() if 'Unnamed'not in x ]#生成第一层级的列名列表,这一步要在set\_index之后,否则会把多余的列名也包含在内
columns_multiindex = pd.MultiIndex.from_product([col_index2,col_index], names=['店铺等级', '店铺'])
df.columns=columns_multiindex

添加完index和多层级columns之后效果如下:
图2
第二三步:

#stack,将column index 转化为index(类比excel里的行列转置操作),然后通过reset\_index将所有index恢复为列
df = df.stack(['店铺等级', '店铺']).reset_index()
df

效果:
图3
PS:这么一通操作总算是对dataframe的索引有了更深的了解了,iloc,loc什么的概念也都清楚了。

进阶方法

在实际工作中处理表格数据时,发现上面的方法只适用于以下有包含关系的列名(主要原因是使用了MultiIndex.from_product):示例表头1
而当关系变得更加复杂时……就不适用啦:
示例表头2

导入&观察数据

数据读取结果
还是可以看出:

  1. excel中作为列信息部分在读取之后变成了行信息;
  2. 合并的单元格被拆分,并且拆分后只有最左边的单元格有信息。

处理思路及代码

整体思路和初级方法中的思路类似,依旧是围绕数据框的索引进行操作,在进行stack()之前分别提取和处理行索引、列索引和值,构建新的数据框,整体的步骤和函数反而更加简单。
分别提取各部分

分步操作版:
提取列索引

提取列索引(包括当前列索引)为值,行填充空值。

df_column = df.iloc[0:4,2:]
df_cols = pd.DataFrame([df_column.columns.to_list()],columns = df_column.columns.to_list(),index = [0])
df_column = pd.concat([df_cols,df_column]).reset_index(drop = True)
df_column.loc[0,df_column.loc[0,:].str.contains('Unnamed') == True] = np.nan
df_column.fillna(method = 'ffill',inplace = True,axis = 1)

列索引

提取行索引

提取行索引

df_index = df.loc[:,['列名1','列名2']]
#df\_index.fillna(method = 'ffill',inplace = True)
df_index = df_index.drop([0,1,2,3],axis = 0).reset_index(drop = True)
df_index

注:将df切片并且传递给新变量df_index = df.loc[:,['列名1','列名2']]时,需要用iloc或者loc,否则会出现SettingWithCopyWarning。

提取值
df_value = df.iloc[4:,2:]
df_value

在这里插入图片描述

构建新数据框
df_value.index = df_index.T.values.tolist()
df_value.columns = df_column.values.tolist()
df_value.index.names = ['列名1','列名2']#这里命名的是行索引的名称
df_value.columns.names = ['colname1','colname2','colname3','colname4','colname5']#这里命名的是列索引的名称
#行索引名称和列索引名称在最终的结果表中都是作为列名出现

在这里插入图片描述
在jupyter中呈现的结果是这样的,看上去没有对齐可能会造成误解,实际上已经是想要的形式了,可以导出到csv里核实一下:
在这里插入图片描述

最后

不知道你们用的什么环境,我一般都是用的Python3.6环境和pycharm解释器,没有软件,或者没有资料,没人解答问题,都可以免费领取(包括今天的代码),过几天我还会做个视频教程出来,有需要也可以领取~

给大家准备的学习资料包括但不限于:

Python 环境、pycharm编辑器/永久激活/翻译插件

python 零基础视频教程

Python 界面开发实战教程

Python 爬虫实战教程

Python 数据分析实战教程

python 游戏开发实战教程

Python 电子书100本

Python 学习路线规划

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值