这篇博客主要记录pandas库的一些基本操作,主要包括:
读写excel数据、介绍Series与DataFrame、查看列名/索引/数据类型、排序、筛选、重置索引
导入头文件
import pandas as pd
- 主要用到的库就是pandas
读取xlsx文件
df = pd.read_excel('数据分析.xlsx','Sheet1')
- 新版本的excel生成的文件后缀一般都是.xlsx,老版本是.xls,使用pandas库的read_excel函数可以读取其中的数据。类似的,读取csv函数使用pd.read_csv函数
- 该函数常用的参数是文件路径(即’‘数据分析.xlsx’’)和表名(即’‘Sheet1’’)
pd.read_excel函数原型及常用参数:
pd.read_excel(io, sheetname=0,header=0,skiprows=None,index_col=None,names=None,
arse_cols=None,date_parser=None,na_values=None,thousands=None,
convert_float=True,has_index_names=None,converters=None,dtype=None,
true_values=None,false_values=None,engine=None,squeeze=False,**kwds)
- io:excel文件路径
- sheetname:表名,也可以传入数字索引,默认为0。传入一个列表可得到多表,传入None可以得到全表,此时会返回一个字典
- header:指定作为列名的行
- index_col:指定作为索引(行名)的列
read_excel函数的返回值:DataFrame
pd.read_excel读取excel得到一个返回值,数据类型是DataFrame。我们想对一张表格进行处理,其实就是对这个DataFrame进行一系列操作,在了解DataFrame之前,还需要了解pandas里另一个基本的数据结构Series.简单来说:
- Series就是带索引的一列(或者是一行)数据,或者说是一个带自定义索引的数组,索引是可重复的。可以用以下函数创建:
a = pd.Series(['张三','李四','王五'],index=['壹','贰','叁'])
张三、李四、王五是这个Series的内容,‘壹’,‘贰’,'叁’则是它的索引,也可以不指定索引,这样会使用默认的索引0,1,2…。类似于数组/列表,可以使用索引来访问Series的内容,比如a[‘壹’]就是‘张三’。事实上根据这种对应关系可以猜到,也可以用一个字典作为参数创建一个Series。
- DataFrame也是一种数据结构,可以看成是由很多个Series组成的,在横纵方向上都有索引。正如使用read_excel函数可以将excel文件存入DataFrame,DataFrame的结构和一张excel表的结构十分类似,excel表的横向最上方是英文字母ABCDEFG…纵向最左方是数字1234567…这样就可以用字母+数字定位一个单元格,比如A1就是左上方那个格子。DataFrame也是一样,含有对列的索引,叫做列名(columns);含有对行的索引,就叫做索引(index)。可以用以下函数创建一个DataFrame:
df1 = pd.DataFrame([[1,2,3,4],['一','二','三','四']],index=[1,2],columns=['A','B','C','D'])
#使用二维'数组'
df2 = pd.DataFrame({'A':[1,2,3,4],'B':[5,6,7,8]})
#使用字典
查看列名、索引及数据类型
使用 df.columns 查看列名
使用 df.index 查看索引
注意返回的类型是pandas.core.indexes.base.Index,可以转换成我们更熟悉的列表
注:使用df.rename(columns={‘替换前’:‘替换后’},inplace=True)可以更改列名
使用 df.dtypes 查看(每一列的)数据类型
object 类似于 str,其他类型有 int64、float64 等
In[]:df1.dtypes
Out[]:
A object
B object
C object
D object
dtype: object
储存DataFrame为excel文件
前面说过,使用 read_excel 函数读取excel文件返回了一个DataFrame,现在假设我们已经完成了需要的操作,DataFrame已经变成了我们需要的样子,那么,怎么将其储存为 excel 文件呢?可以使用 df 的to_excel函数。为了方便使用,我已经将它封装成一个函数:
def save_as_excel(df,xlsx_name='a.xlsx',sheet_name='sheet1',startrow=0,startcol=0):
"""
功能是保存一个df对象为excel文件(xlsx)
df:要保存的dataFrame对象
xlsx_name:要保存的名字,注意加上后缀
sheet_name:要保存的表的名字
"""
writer=pd.ExcelWriter(xlsx_name)
df.to_excel(writer,sheet_name = sheet_name,startrow=startrow,startcol=startcol,index=False)
writer.save()#需要加上这一行,否则无法生成文件
排序
在 excel 中排序并不难,可以 “右击-排序” 或者 “数据-排序” ,在python/pandas中对一个DataFrame的某一列数据进行排序,可以使用 sort_values 函数:
df = df.sort_values(by=sort_by,ascending=False)
第一个参数显然是排序的依据(列名),是一个字符串或列表
第二个参数 ascending 控制升序还是降序,ascending = False表示降序,=True表示升序。该参数默认是True
筛选
筛选也是非常常用的功能,但是在pandas中第一次使用可能并不习惯:
df = df[df的筛选条件]
举个例子:
对于这样一个DataFrame,如果想要筛选出一班的成绩,代码是这样写的:
更高级的一些写法:
df[(df.班级=='1班')|(df.班级=='2班')]
使用逻辑关系构造多个条件进行筛选df[df.班级.isin(['1班','2班'])]
使用列表进行筛选,用到了isin()
方法df[df.班级.str.contains('班')]
使用字符串的contains()
方法通过字符串进行筛选
注意,并不存在 isnotin
的写法,需要反选用的是:df[~df.班级.isin(['1班','2班'])]
重置索引
无论是排序还是筛选,得到的DataFrame索引仍是原来的,并没有从零开始重新排列,以筛选为例:
可以看出来索引是从8、9、10而不是0、1、2,这在某些场合会造成错误,如果需要重置索引,只需要使用df = df.reset_index(drop=True)
其中drop=True
的作用是丢弃原来的索引,否则dataframe会在最左边第一列自动生成一列(index)用于储存原来的索引。
在筛选之后操作dataframe很容易出现
index out of range
的情况,很有可能就是索引没有重置引起的。
groupby
groupby函数实现了类似excel中数据透视表的功能, 常用格式
df = df.groupby([col1, col2, ...])[col3, col4, ...].sum()
注意:
- 如果不想聚合项(col1, col2, …)直接变成索引,应该在最后加上
reset_index()
, 但是不要drop,否则聚合项会被丢弃 - 如果想对不同的列应用不同的聚合函数,那么应该使用agg方法
df = df.groupby([col1, col2, ...]).agg(
{'col3':'max', 'col4':'mean',...}
)
参考资料:
- https://blog.csdn.net/weixin_44056331/article/details/89342217
- https://www.cnblogs.com/654321cc/p/9302370.html