在平时学习和建模过程中,处理Excel文档是非常常见的工作,而Excel在Python眼中就是一个简单的datafram类型的数据
1、读取Excel文件的数据
1 import pandas as pd 2 import numpy as np 3 4 # 函数read_excel用来读取Excel文档为dataframe类型,参数sheet_name可以是工作簿中工作表的索引(从0开始),也可以是工作表的名字 5 data = pd.read_excel("enterprise123_data.xlsx", sheet_name=1) # 此处读取第二个工作表
函数read_excel返回的直接就是一个dataframe类型的数据
2、对于内容的索引
首先看一下Excel表格内的内容
此处我们想索引企业代号为E1的企业的价税合计所在列的数据,用dataframe数据的索隐函数loc来实现,实力操作如下:
price_tax_sum = data.loc[data['企业代号']=='E1', '价税合计']
选取的E1企业的价税合计数据存储在变量price_tax_sum中,price_tax_sum同时也是一个dataframe类型的数据
使用price_tax_sum中元素的值:
array = price_tax_sum.values # 将元素中的值赋给变量array,array为一个一维数组
也可直接用dataframe类型的行列索引访问price_tax_sum中的每个元素,但一般都是对数据处理都是大批处理,因此转为数组然后用for循环处理比较方便
3、如何大批量对不同企业代号的企业数据进行选取呢?
这里要用到字符串的格式化,因为不同企业的企业代号均为字符串形式,不同在于E后面的数字不同
1 for i in range(1,124): 2 txt = "E{}" 3 price_tax_sum = data.loc[data['企业代号']==txt.format(i), '价税合计']
代码中txt.format(i)就表示将数据 i 填充到字符串txt中的{}内,这样每一轮for循环得到的price_tax_sum就是不同企业的价税合计数据,在循环体中即可对价税合计数据进行操作
字符串的格式化也可以支持多值索引,具体可自己****,理解起来很简单
4、总结一下dataframe类型中我经常需要用到的使用操作
(1)删除dataframe中行和列的方法总结
删除具体列:删除工作表中“价税合计”整列元素:
data = data.drop('价税合计', axis=1) # axis=1表示删除的是列元素,函数参数为列索引名
删除具体行:删除E1企业的所有行:
data = data.drop('E1') # axis=0或者不写表示drop函数默认删除行元素,函数参数为行索引名
删除特定数值的行(最常用):删除发票状态为作废发票的行:
data = data[data['发票状态'] == '作废发票']
删除/保存包含某些字符、文字的行:
# 删除发票状态中包含“作废”两字的行 data = data[~data['发票状态'].str.contains('作废')]
# 保存发票信息中包含“有效”两字的行,区别在于不要"~" data = data[data['发票状态'].str.contains('有效')]
(2)填充空值
# 删除存在空值的行 data = data.dropna() # 删除存在空值的列 data = data.dropna(axis=1) # 填充空值 data.fillna(3, inplace=True) # inplace=True表示在原DataFrame上修改 # 结合一些计算出来的值进行填充 data.fillna(np.mean(data['价税合计']), inplace=True)
对某些单元格满足特定条件进行修改其值时,可利用for循环来批量处理
在每轮循环中用if判断是否满足条件,如满足则修改成特定值
(3)两大索隐函数loc和iloc的区别
loc——通过行标签索引行数据
iloc——通过行号(为数字)索引行数据
iloc是按照行数取值,而loc按着index名取值
(4)更改索引值
# 直接给行、列索引赋值进行更改 data.columns = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'] data.index = ['a', 'c', 'd']