pandas对excel表格的部分操作总结(不定期更新)
前言
之前参加过数学建模比赛,其中用到了一些Python关于表格处理的方法,想着给总结一下,方便日后查看。
水平有限,如有错误,还请指正。
导入pandas库
首先使用pip命令安装pandas()函数库,接着使用import命令即可导入使用
pip install pandas
#导入pandas库并且起个别名为pd
import pandas as pd
read_excel()函数的参数
函数参数众多,有些我也不是特别了解(QAQ),这里仅对其中部分参数做出解释,如有错误,欢迎指正。
def read_excel(io,#路径对象或类似文件的对象
sheet_name=0,#指定选择的excel表格名字
header=0,#指定标题行
names=None,#要使用的列名列表
index_col=None,#指定列索引
parse_cols=None,
usecols=None,#指定要选择读取数据的列号,如果是None,表示读取所有列
squeeze=False,
dtype=None,#指定数据类型
engine=None,
converters=None,
true_values=None,
false_values=None,
skiprows=None,#跳过指定行的数据
nrows=None,
na_values=None,
keep_default_na=True,
na_filter=True,
verbose=False,
parse_dates=False,
date_parser=None,
thousands=None,
comment=None,
skip_footer=0,
skipfooter=0,
convert_float=True,
mangle_dupe_cols=True,
**kwds)
一些实例
测试使用的excel表格数据
整体读取表格数据
import pandas as pd
#注意左斜杠写一个即可,右斜杠需要些两个
filepath='xxx/xxx/xxx.xlsx'
#路径可以是相对路径,也可以是绝对路径
data=pd.read_excel(filepath)
data
当只读取一个Sheet的时候,read_excel函数返回的是DateFrame类型的数据。这是一种表格数据类型。
结果:
对filepath格式的解释
有的同学可能会很疑惑,有时候将电脑上显示的路径直接复制过来,运行直接报错。这是为什么呢?
我们可以发现,电脑上的路径分隔符是’‘,但是’‘在Python中是一个转义符号,直接将他写入字符串的话,Python在编译的时候或产生错误,比如这个例子,在语法中是不存在’\j’的,因此会报错。
解决办法:
- 遵照Python的语法,将右斜杠改为左斜杠
- 将每个右斜杠写两遍,如:“xxx\\xxx\\xxx.xlsx”,表示显式不转义
- 在filepath字符串开头写一个r,表示强制不转义。
如:filepath=r"xxx\xxx\xxx.xlsx"
将结果转换为数组格式
import pandas as pd
import numpy as np
data=pd.read_excel("test.xlsx")
data=np.array(data)
print(data)
结果:
对标题行的指定
import pandas as pd
import numpy as np
data=pd.read_excel("test.xlsx",header=None)
data
结果:
可以看到,如果标题行参数header为None的时候,Python默认选取从0开始的一串数字来作为标题行,而将原本的列名(学生编号,语文等)作为数据部分。
如果想要指定自定义的标题行的时候,需要显示指出,将参数值写成自己想要的那一行即可(Python默认第一行索引为0)。
import pandas as pd
import numpy as np
data=pd.read_excel("test.xlsx",header=0)
data
对列名的指定
有的时候,我们想修改列名,这个时候就需要使用参数names
import pandas as pd
import numpy as np
data=pd.read_excel("test.xlsx",header=0,names=list('ABCDEFGHI'))
data
结果:
可以看到之前的列名现在已经别修改为了A~I,要注意列名的数量和实际的列数量要一致,否则会产生错误。
指定列索引
在默认情况下,Python都是默认指定从0开始的列索引
在实际的情况下,我们是可以更改列索引的,这个时候需要指定index_col参数
import pandas as pd
import numpy as np
data=pd.read_excel("test.xlsx",header=0,index_col=0)#指定第0列为索引
data
可以看到之前的第1列(Python的列索引是从0开始),现在作为了索引。
指定列获取数据
有的时候我们只想获取某些列的数据,这个时候就需要指定usecols参数
import pandas as pd
import numpy as np
data=pd.read_excel("test.xlsx",header=0,usecols=[0,2,4,6,8])#指定获取下标为0,2,4,6,8列的数据
data
结果:
现在我们只获取了指定列(0,2,4,6,8列)的数据
其他的一些处理手段
由于Python对表格数据处理的手段非常多,下面只列出了一小部分。
之后有时间会不定期更新。
多角度获取数据1
#注:一下所说的获取第n行数据均指Python中的索引值
import pandas as pd
import numpy as np
data=pd.read_excel("test.xlsx",header=0)
print(data.values)#获取全部数据,返回类型是一个二维数组
print(data.index.values)#获取行索引
print(data.columns.values)#获取列索引
print(data.values[i,j])#获取第i行第j列的数据
print(data.values[i])#获取第i行的数据
print(data.values[[i,j,k]])#获取第i,j,k行数据
print(data.values[:,i])#获取第i列的数据
print(data.values[:,[i,j,k]])#获取第i,j,k列的数据
多角度获取数据2
#注:一下所说的获取第n行数据均指Python中的索引值
import pandas as pd
import numpy as np
data=pd.read_excel("test.xlsx",header=0)
print(data.shape)#获取整体数据的行数和列
print(data.head(4))#只获取前四行数据
print(data.tail(4))#只获取最后四行数据
print(data.info())#直接获取一个完整的表格数据分析,更快一点
多角度数据处理3
数据替换replace函数
为了更清楚地看清效果,我们先手动将历史这一栏的数据修改一下。
替换一个值
方法一:
import pandas as pd
import numpy as np
data=pd.read_excel("test.xlsx")
#将历史这一列中,数据是94的修改为90
#注意如果是字符串则需要添加引号
data=data.replace({'历史':{94:90}})
data
方法二:
注意这里需要在data中指定需要替换的列名
import pandas as pd
import numpy as np
data=pd.read_excel("test.xlsx")
data['历史']=data['历史'].replace(to_replace=94,value=90)#to_replace指定需要更换的数据,value指定更新后的数据
data
两种方法结果都是一样的
修改效果如下:
替换多个值
方法一:
import pandas as pd
import numpy as np
data=pd.read_excel("test.xlsx")
data=data.replace({'历史':{94:84,95:85}})
data
方法二:
import pandas as pd
import numpy as np
data=pd.read_excel("test.xlsx")
data['历史']=data['历史'].replace(to_replace=[94,95],value=[84,85])
data
将数据存放回excel表格
情形一(普通保存)
pandas提供了to_excel函数将数据保存至excel表格中
import pandas as pd
import numpy as np
data=pd.read_excel("test.xlsx")
data.to_excel("test.xlsx",sheet_name='results')#指定路径和写回的表格的名称
注:只能将DataFrame类型的数据存放到表格中,二维数组不行,必须要转换。转换的一个方法如下:
import pandas as pd
import numpy as np
data=pd.read_excel("test.xlsx")
data=np.array(data)#将DataFrame转为二维数组
data=pd.DataFrame(data)#将二维数组转换为DataFrame
data.to_excel("test.xlsx",sheet_name='results')
情形二(对数据进行简易条件判断后保存)
有的时候,我们获取数据后,提取出某一列满足某个条件的数据后,再将这些数据保存到excel表格中。
如:我们想获取数学成绩大于80分的学生,并将这些学生保存到excel表格中.
这种情况下,可以采用以下的方法:
import pandas as pd
data=pd.read_excel("test.xlsx")
print(data)
data=data[data['数学']>80] #提取出数学成绩大于80的学生数据
data.to_excel("1.xlsx",index=False) #设置index,指定讲dataframe的第一列作为excel表格中的第一列。
原始数据(test.xlsx):
提取后数据(1.xlsx)
这里注意一个细节,如果不设置index的话,pandas会自动给我们设置一个列索引,效果如下图所示,而这通常不是我们想要的,因此,可以显式取消默认的列索引。
情形三(对数据进行处理后排序保存)
有时候,我们获取数据后,不但想要对其进行筛选后保存,并且又想对数据按照我们的想法进行排序。这时候就需要用到pandas中的sort_values方法。
使用方法如下:
import pandas as pd
data = pd.read_excel("test.xlsx")
print(data)
data = data[data['数学'] > 80] # 提取出数学成绩大于80的学生数据
data.sort_values(by='数学', inplace=True, ascending=False)
data.to_excel("1.xlsx", index=False) # 设置index,指定讲dataframe的第一列作为excel表格中的第一列。
对参数的解释:
- by参数用于指定一个列进行排序(这里指定按照数学一列的数据进行排序)
- inplace参数默认为False,如果该值为True,那么就会在当前的dataframe上操作。
- ascending默认为True,表示从大到小排序,如果改为False表示从小到大排序。
原始数据(test.xlsx):
提取后数据(1.xlsx)
可以看到确实是按照数学这一项的数据,从大到小进行排序,效果符合预期。
inplace参数的效果:
对DataFrame进行输出:
设置inplace参数为True,排序后,DataFrame改变
设置inplace参数为False,排序后,DataFrame不改变
可以理解为,设置inplace参数为True,对DataFrame的修改是“永久的”,而设置inplace参数为False,对DataFrame的修改是“暂时的”。
因此,如果涉及到排序后保存或者在其他地方继续使用,则需要设置参数inplace为True。