一、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')
观察数据
导入数据之后,需要根据数据呈现出的格式进行相应的操作。
可以看出:
- excel中作为列信息的店铺在读取之后变成了行信息;
- 合并的单元格被拆分,并且拆分后只有一个单元格有信息。
处理思路及代码
- 将产品类别和产品质量字段设置为index,然后设置店铺等级和店铺为多层级columns;
- 使用stack()对表格进行转置操作,此时多层次的columns也变为了index;
- 使用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之后效果如下:
第二三步:
#stack,将column index 转化为index(类比excel里的行列转置操作),然后通过reset\_index将所有index恢复为列
df = df.stack(['店铺等级', '店铺']).reset_index()
df
效果:
PS:这么一通操作总算是对dataframe的索引有了更深的了解了,iloc,loc什么的概念也都清楚了。
进阶方法
在实际工作中处理表格数据时,发现上面的方法只适用于以下有包含关系的列名(主要原因是使用了MultiIndex.from_product):
而当关系变得更加复杂时……就不适用啦:
导入&观察数据
还是可以看出:
- excel中作为列信息部分在读取之后变成了行信息;
- 合并的单元格被拆分,并且拆分后只有最左边的单元格有信息。
处理思路及代码
整体思路和初级方法中的思路类似,依旧是围绕数据框的索引进行操作,在进行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行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!