excel表格_excel函数公式大全_execl从入门到精通
别再用for循环遍历获取Excel数据,pandas一个函数搞定!不香吗?2024-02-23 01:57:56
前面内容,我们讲解了使用openpyxl处理Excel的基本方法,细心的小伙伴肯定发现了,我们利用openpyxl从Excel中获取数据时,多数情况下使用了for循环。
for循环从前面的分析我们知道,对于海量数据,多次使用for循环会带来不必要的内存浪费。
浪费可耻,节约光荣假设我们想要从一个Excel表格中某一列选择符合要求的数值(比如在某一区间范围内的数值),然后将这些数据写入到另一个Excel文件中,该如何解决呢?
如何解决呢?如果使用第三方库openpyxl或者xlrd、xlwt,前面已经介绍了很多内容,感兴趣的小伙伴了解下。今天,我们来掌握另一个更加简单的方法,使用pandas库来处理Excel文件。
此pandas非彼pandaspandas库
对于pandas库的讲解,今天不浪费过多篇幅,你只需知道它是一个功能强大的数据分析处理库即可。对于pandas库的讲解,网上有很多内容,今天这里就不赘述了。
小伙伴们自己上网课吧我们先来看下,单就读取各种文件,pandas为我们提供了哪些接口?
>>>import pandas as pf
>>>print([i for i in dir(pd) if i.startswith('read')])
['read_clipboard', (次粗略去n个方法,感兴趣的小伙伴自己尝试) 'read_stata', 'read_table']
就读取各类文件,pandas为我们提供了将近20个函数接口供调用。感兴趣的小伙伴挨个试试看。
重点来了,接着往下看pandas处理Excel文件
我们先来创建一个演示用的Excel文件,命名为‘test.xlsx’,里面一张表格score,记录了学生的语文数学成绩。如下:
创建电子表用于测试下面,我们按照步骤来演示如何利用pandas操作一个Excel文件
# 导入模块
import pandas as pd
1.读取Excel文件
df = pd.read_excel('test.xlsx')
我们看下df是什么东东?
print(type(df))
>>><class 'pandas.core.frame.DataFrame'>
它是一个DataFrame对象实例(这里暂且不论,后续专题讨论)。
积少成多为了对这个函数加深理解,我们把完成参数列表整理了一下,感兴趣的小伙伴深入研究。
pd.read_excel(io,sheetname=0,header=0,skiprows=None,index_col=None,names=None,date_parser=None,na_values=None,thousands=None,convert_float=True,converters=None,dtype=None,true_values=None,false_values=None,engine=None,squeeze=False,**kwds)
io :excel 路径sheetname:默认是sheetname为0,返回多表使用sheetname=[0,1],若sheetname=None是返回全表 。注意:int/string返回的是dataframe,而none和list返回的是dict of dataframeheader:指定作为列名的行,默认0,即取第一行,数据为列名行以下的数据;若数据不含列名,则设定 header = Noneskiprows:省略指定行数的数据index_col:指定列为索引列,也可以使用 u’string’names:指定列的名字,传入一个list数据date_parser:函数,用于将字符串列序列转换为日期时间实例na_values:na\nan字符串的处理方式thousands:用于将字符串列解析为数字的千位分隔符。注意,此参数仅适用于Excel中存储为文本的列。无论显示的如何,任何数值列都将自动解析convert_float:将整数浮点转换为整数(即1.0-->1)。如果为False,则为所有数字数据将作为浮点数读入,Excel将所有数字存储为浮点数内部converters:用于转换某些列中的值的函数。键可以是整数或列标签,值是接受一个输入参数、Excel单元格内容并返回转换内容的函数dtype:默认不指定,比如:{'a':np.float64,'b':np.int32}使用'object'保存Excel中存储的数据,而不解释数据类型。如果指定了转换器,则将应用它们而不是数据类型转换true_values:值视为真,传递列表,默认为Nonefalse_values:值视为假,传递列表,默认为Noneengine:如果io不是缓冲区或路径,则必须将其设置为标识io。可选的参数有:“xlrd”、“openpyxl”、“odf”、“pyxlsb”。兼容性描述:“xlrd”支持旧式Excel文件(.xls)、“openpyxl”支持更新的Excel文件格式、“odf”支持OpenDocument文件格式(.odf、.ods、.odt)、“pyxlsb”支持二进制Excel文件squeeze:如果解析的数据只包含一列,则返回一个序列。默认只包含一列时,不返回一个序列2.读取行数和列数及行列索引
row_num = len(df.index.values)
col_num = len(df.columns.values)
读取行列元素同理,行列索引我们使用下面方式获得
row_indexs = df.index.values
print(row_indexs, type(row_indexs))
>>>
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21]
<class 'numpy.ndarray'>
可以看出,列表索引是一个ndarray数组对象,注意,这里的索引是从0开始的。
索引很重要哦同样的道理,我们获取列索引试试看
col_indexs = df.columns.values
print(col_indexs, type(col_indexs))
>>>
['学生证号' '姓名' '性别' '年龄' '语文' '数学'] <class 'numpy.ndarray'>
它同样打印出了列索引,数据类型为numpy.ndarray
3.读取指定的单行或单列数据
读取行列数据# 取单行数据(第一行)
df.loc[0].values
>>>
array([20210001, '张三', '男', 24, 67, 87], dtype=object)
正确显示,默认第一行为标题行,没有展示
# 取单列数据(第一列)
df.loc[:, '姓名'].values
>>>
array(['张三', '李四', '王五', '王二麻子', '张小双', ' 李赛', '李磊', '韩梅梅', '李小白', '杜甫堂', '孙悟空', '猪八戒', '唐僧', '沙和尚', '贾宝玉', '袭人', '薛宝钗', '林黛玉', '王熙凤', '刘姥姥','贾琏', '贾政'], dtype=object)
还可以使用DataFrame的iloc方法,不同的是iloc方法传入索引值(整数),loc方法传入标签值,记住这一点就可以了。上面同样可以用iloc实现
# 单行获取
df.iloc[0].values
# 单列获取
df.iloc[:, 1].values
4.读取任意多行或多列数据
df.loc[行范围(标签表示), 列范围(标签表示)].values
或者是索引:
df.iloc[行索引范围, 列索引范围]
如:选取0-10行姓名和语文成绩列
df.loc[:10, ['姓名', '语文'] ].values
# df.iloc[:11, [1, 4]].values # (此处切片为左闭右开区间
>>>
array([['张三', 67],
['李四', 65],
['王五', 63],
['王二麻子', 85],
['张小双', 82],
['李赛', 87],
['李磊', 94],
['韩梅梅', 99],
['李小白', 97],
['杜甫堂', 91],
['孙悟空', 79]], dtype=object)
多行多列也不怕5.读取单元格数据或部分数据(同4视角不一样)
# 获取第2行第2列的数值
print(pd.iloc[1, 1])
>>>
"李四"
# 获取第1,2行,2,4列的数据
data = df.iloc[[1,2], [2, 4]].values
print(data)
>>>
[['男' 65]
['男' 63]]
注意,此时的索引都是从0开始的。
举个例子
下面,我们用一个简单的例子,来看下如何使用我们刚才学到的知识?
假设我们在'test.xlsx'中有另一张表格,它记录了学生的英文成绩。那么,我们今天的例子是将两张表格合并,并保存在'bobTest.xlsx'中。
score2表格记录英文成绩如何做呢?
首先,我们需要数据:
df1 = pd.read_excel('test.xlsx', sheet_name='score')
df2 = pd.read_excel('test.xlsx', sheet_name='score2')
# 两者合并,得到我们需要的数据
df3 = pd.merge(df, df2.iloc[:, [1,2]], how='inner', on='姓名')
# how是连接方式,这里选择内连接,on是依据哪一列连接
数据要保存起来数据有了,我们把数据保存起来
此时,使用df3.to_excel('bobTest.xlsx', sheet_name='score3')
合并成功好了,数据成功合并了。用到一个for循环了没?
数数几行代码吧?4行代码搞定,是不是很方便?
好了,今天的内容就到这里了,喜欢Python编程的小伙伴点个赞,后续推出更加精彩的内容。
本文为作者原创,转载请注明出处,百家号:Python高手养成
标签: excel不为空值返回时间