我们一般都是预定将pandas库加载为pd(import pandas as pd),这种方式也是官网推荐的方式。
pandas模块依赖于numpy模块(在pip安装pandas时会自动安装),也需要引入import numpy as np
pandas的数据结构有Series和DataFrame
Series是一维数据结构 DataFrame表示为具有行和列的二维数据 DataFrame的每个column就是一个Series
一、创建数据对象
创建Series数据
Series(data=None,index=None,dtype=None,name=None) data:创建的Series对象的数据,可以为list或dict 打印时会打印两列。第一列称为索引(data为list时通常从0开始,data为dict时为dict的键),第二列是对应的数据 index:指定索引的值,index必须是一个tuple或list data为list或dict时index的元素数量必须和data中的数据数量相同 data为一个字符串或数字时,会按照index的数量建立相同数量的数据,且所有索引对应的值相同(都为data) dtype:指定数据的数据类型 name:指定Series数据对象的name,当在DataFrame的上下文中使用时,这个名称作为列名
创建DataFrame数据
1、手动创建
DataFrame(data=None,index=None,columns=None,dtype=None) 手动将数据输入,这只适用于微小的数据集 data:要输入的数据 当data为dict时 {"col1_name": [1,2,3,4],"col2_name": ["one", "two", "three", "four"]} 当data为list时 [{'col1_name': 1, 'col2_name': 2}, {'col1_name': 5, 'col2_name': 10}] [[1,2,3],[4,5,6]] #这种格式的list不提供columns默认为数字 index:指定索引值,默认为数字索引(从0开始) columns:指定列名称,默认为数字(从0开始) dtype:指定所有列的数据类型
2、从文件加载
从不同的文件加载有各自对应的方法,常用的有:
read_excel()、read_csv()、read_html()、read_json()、read_sql()、read_sql_query()、read_sql_table() read_sql()是从一个sql查询或sql表格中导入,整合了read_sql_query()和read_sql_table()
read_table(path_or_buf,sep='\t',header=None,names=None,index_col=None,prefix=None,mangle_dupe_cols=True,dtype=None,engine=None,converters=None, true_values=None, false_values=None, skipinitialspace=False, skiprows=None, skipfooter=0, nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True,thousands=None,encoding=None)
path_or_buf:可以是文件本地路径,也可以是URL,URL协议包括http、ftp、s3和file。 sep:指定列分隔符 header:指定作为列名的行号,可以是一个int或int组成的list,默认从文件的第一行推断列名 names:通过一个不允许有重复值的list或set等指定所有列名称,当指定该参数时需要指定header参数值为0 index_col:用作索引的列名称str或列索引int,也可以是一个它们组成的list prefix:当没有列名称时默认添加列名称的前缀 mangle_dupe_cols:重复列将被指定为'col_name','col_name.1','col_name.2'... dtype:使用dict指定列的数据类型,如{'col_1':type1,'col_2':type2,...},键名为列名称str或列索引int engine:要使用的分析器引擎('c'或者'python')。C引擎更快,而python引擎目前功能更完善。 converters:用于转换某些列中的值的函数的指令。{'col_1':func1,'col_2':func2,...},键名为列名称str或列索引int true_values=None,false_values=None:要视为正确或失败的值 skipinitialspace:是否跳过分隔符后的空格 skiprows:int表示跳过文件的前int行,int组成的list表示跳过指定的行 skipfooter:表示跳过从尾部开始的第int行 nrows:要读取的文件行数。用于读取大文件的片段。 na_values:list,要识别为NaN的值 keep_default_na:是否把空值识别为NaN na_filter:检测缺少的值标记(空字符串和na_values指定的值)。设置为False可以提高性能,特别是读一个大文件时 skip_blank_lines:空行是否跳过 thousands:千位分隔符 encoding:字符编码
3、数据添加
data['three']=data['one'] * data['two'] #添加一个列名为three的列,列中的值为前两列的乘积 data['four']='demo' # 添加一个列名为four的列,列的值全部为demo data['five']=Series # 从一个Series数据中添加一个列名为five的列 data.insert(colx,'col_name',list) 添加列名为col_name的list的内容到data的第colx的位置 list的元素数量必须等于data的行数,否则报错
4、数据合并
data1.append(other,ignore_index=False) other:要合并到data1下面的数据,可以是一个也可以是一个list ignore_index:合并以后索引值是否重建 pandas.concat(objs, axis=0, ignore_index=False) objs:要合并的DataFrame数据组成的list axis:合并的轴向,为0表示向下合并,为1表示向右合并 ignore_index:合并以后索引值是否重建
二、基础属性和方法
shape:包含行数和列数的二元元祖 index:所有索引值 columns:所有的列名称 values:不包含列名称的所有值 dtypes:所有列的数据类型 astype(type_str):更改Series对象的数据类型 describe():返回基本统计信息 对于数字列:值计数,平均值,标准差,最小值,最大值,第25,第50和第75的中位数; 对于字符串列:值计数,唯一条目数,最常出现的值(top value)以及最常出现值出现的次数(freq); DataFrame对象返回所有具有numeric数据类型的列的统计信息 ndim:获取数据中的维数,Series通常为1,DataFrame通常为2 head(n):前n行(n默认为5) tail(n):最后n行(n默认为5) Series.count():统计数据总数 Series.value_counts():统计数据中各个值出现的次数 isnull():依次判断值是否为空 notnull():依次判断值是否不为null Series.rename(new_name):重命名Series数据
三、数据获取
data.column_name或者data[column_name]:获取一个指定名称的列 data['column_name_1','column_name_2','column_name_3']:根据列名选择多列 iloc[rows,columns]:根据数字索引获取指定的行或列 获取行或列都必须使用数字索引来获取 rows:指定的行,可以为一个数字或切片((start_rowx:end_rowx)) columns:指定的列,可以为一个数字或数字组成的list([colx1,colx2,colx3...]) loc[rows,columns]:根据索引实际值或列名称获取指定的行或列 获取行按照索引的实际值,获取列必须是字符串类型的列名称 rows:指定的行,可以为一个索引值或切片 columns:指定的列,可以为字符串或字符串组成的list data[data[column_name]的布尔运算]:选择指定列column_name中值布尔运算返回True的所有行 data[data["销量"]>15] #返回所以销量大于15的行 data.isin(list):依次判断所有值是否包含在list中并替换为布尔值 data.loc[data.isin(list)]:把返回的布尔值换成原来的值 data.query("条件筛选"):筛选出符合条件筛选的所有行 data.query("年龄>35 & (政治面貌=='党员' | 籍贯=='河北')") 筛选出所有年龄大于35岁的党员和河北籍的人员信息 data[data['column_name'].str.contains("search_str")] #模糊筛选 data[data['column_name'].str.contains(r"reg_str")] #正则筛选 contains()函数要求数据全部是字符串类型,否则会报错 func(data):返回把data中的所有数据依次带入到func函数中计算的结果 def func(s): return s+5 func(data)返回一个所有数加上5之后的新数据对象
Series数据特有的:
ser[index]或者ser[key_name]:通过索引来获取某一个数据 ser[start_x:end_x]:通过切片获取某一部分数据 使用list作为索引ser[list]获取list中指定的索引的数据 ser[[4,2,7]] #获取ser中索引值分别为4、2、7的数据 ser.rank(method='average',ascending=True):对ser中的数据进行排名,ascending的值True(升序),False(降序) method的值: average值相等时,取排名的平均值 min值相等时,取排名最小值 max值相等时,取排名最大值 first值相等时,按原始数据出现顺序排名
四、内容的操作处理
删除行或列
drop(labels=None, axis=0, index=None, columns=None, inplace=False, errors='raise') labels:行的索引值或列的名称,一次删除多个可以传入一个list axis:结合labels参数使用,当axis为0时表示要删除行,axis为1时表示要删除列 index:行索引值,一次删除多个可以传入一个list columns:列的名称,一次删除多个可以传入一个list inplace:是否替换原数据对象,默认为False,返回一个删除指定行或列的新的DataFrame数据,如果为True则直接修改元数据且没有返回 errors:如果为'ignore',抑制错误并且只删除现有标签。 del df['col_name'] #删除指定的列 data.pop('col_name') #删除指定的列
删除缺失值
dropna(axis=0, how='any', thresh=None, inplace=False) dropna()#每行只要有空值,就将这行删除 dropna(axis=1)#每列只要有空值,整列丢弃 dropna(how='all')# 一行中全部为NaN的,才丢弃该行 dropna(thresh=3)# 每行至少3个非空值才保留
缺失值填充
fillna(value=None, method=None, inplace=False) fillna(0) #全部用0填充 fillna({1:0,2:0.5}) #对第一列nan值用0填充,第二列用0.5填充 fillna(method='ffill' 或 'pad') #在列方向上以前一个值作为值赋给NaN fillna(method='bfill' 或 'backfill') #在列方向上以后一个值作为值赋给NaN
值替换
replace(to_replace=None, value=None, inplace=False, method='pad') replace(0, np.nan) #将A列中0全部替换成空值 replace([0,-1], np.nan)#将0和-1替换成空值 replace([0,-1],[np.nan,1])#将0替换成空值,-1替换成1 replace({0:np.nan, -1:1})#同上,写法不同,更清晰
重复值处理
duplicated(),drop_duplictad(),unique() duplicated():依次对比每行内容是否重复,返回true和false组成的Series类型 duplicated('col_name') duplicated(['col_name1','col_name2'])#两行只要指定的列一样就算重复 drop_duplicates()#保留指定列组合的唯一值的行,保留第一行,参数提供和duplicated()相同,不提供表示对比所有列的内容,也可以提供一列或若干列 data['col_name'].unique()# 返回一列中唯一值组成的数组
修改列名
rename(columns=None,inplace=False,errors='ignore') 通过传入dict来修改列名{“old_column_name”: “new_column_name”, …} 通过传入数据类的某个方法:data.rename(columns=str.lower)#修改所有列名称为小写 通过传入某个函数来依次修改所有列:data.rename(columns=lambda x: x.lower().replace('.','-'))
五、数据排序
索引排序
sort_index(axis=0, level=None, ascending=True,inplace=False,na_position='last',ignore_index=False) axis:0表示按索引对行排序,1表示按索引对列排序 level:要排序的索引级别(索引级别(从0开始)或索引名称,可以是list或tuple) ascending:True表示升序排序,False表示降序 na_position:排序后空值放在哪里,默认(last)放到末尾,first表示放到开头 ignore_index:是否排序之后重置索引值为从0开始的数字索引
值排序
sort_values(by, axis=0, ascending=True, inplace=False, na_position='last', ignore_index=False) by:指定列名(axis=0或'index')或索引值(axis=1或'columns')组成的list axis:若axis=0或'index',则按照指定列中数据大小排序;若axis=1或'columns',则按照指定索引中数据大小排序,默认axis=0 ascending:是否按指定列的数组升序排列,默认为True,即升序排列 inplace:是否用排序后的数据集替换原来的数据,默认为False,即不替换 na_position:{'first','last'},设定缺失值的显示位置
六、索引操作
索引重建
reindex(labels=None, index=None, columns=None, axis=None, method=None,fill_value=nan) 重建数据的索引或列名,默认更新index,返回一个新的DataFrame new_ser=ser.reindex(['new_index1','new_index2',...]) 指定columns参数更新列名: new_ser=ser.reindex(columns=['new_columns1','new_columns2',...]) 如果原索引或列名称中某个值不存在,所有数据会自动补上NaN method='ffill' 或 'pad' :在列方向上以前一个值作为值赋给NaN method='bfill' 或 'backfill' :在列方向上以后一个值作为值赋给NaN fill_value参数为原先不存在的索引或列补上一个固定的值,而不在是NaN
指定索引
set_index(keys, drop=True, append=False, inplace=False, verify_integrity=False) 将DataFrame中的列columns设置成索引index,可以设置单索引和复合索引 keys:要设置为索引的列名称list,按照list中列名称的顺序分为1级索引、2级索引、... drop:设置成索引的列是否从数据中删除 append:是否保留原有索引(在原有索引的下级创建新的索引) inplace是否在原数据集上修改而不是仅返回新的数据 verify_integrity:是否检查新的索引是否重复(新的索引有重复值会报错)
重置索引
reset_index(level=None,drop=False,inplace=False) 删除指定的索引,将索引变回列,并补上常规的数字索引,其实就是将使用set_index()打造的索引逆向操作 level:只从索引中删除给定的级别(索引级别(从0开始)或索引名称,可以是list或tuple)。默认(None)删除所有级别 drop:删除索引时该索引是否直接删除(默认恢复为列)
七、数据透视
数据透视功能在pandas中用pivot_table方法实现
pandas.pivot_table(data, values=None, index=None, columns=None, aggfunc=numpy.mean, fill_value=None, margins=False, dropna=True, margins_name='All')
data:要进行分析的DataFrame数据,通常用文件导入 data = pandas.read_excel('file_name.xlsx') values:数据透视统计的项目名称(一个或多个(list)) index:透视数据中的索引项目名称(一个或多个(list)) columns:透视数据中的行项目名称(一个或多个(list)) aggfunc:项目统计方法(一个或多个),默认为numpy.mean(平均数),numpy.sum为数值的和,len表示个数 当aggfunc为一个方法名时:aggfunc=numpy.sum 当aggfunc为一个list时:aggfunc=[numpy.sum,len] 当aggfunc为一个dict时: aggfunc={"销量":np.sum,"电量":[np.sum,np.mean]} 上例中表示按销量计算总和,按电量计算总和和平均数 fill_value:当统计结果为空或NaN时使用指定字符代替 margins:是否显示汇总信息 dropna:是否删除全部为空或NaN的列 margins_name:显示汇总信息时的显示标题
八、导出和保存
常用的导出方法有:
to_csv(),to_excel(),to_html(),to_json() to_markdown(),to_numpy(),to_pickle(),to_sql(),to_string() to_excel(save_file,sheet_name='Sheet1',na_rep='', float_format=None,columns=None,header=True, index=True,index_label=None,startrow=0, startcol=0,inf_rep='inf',freeze_panes=None,encoding=None) na_rep:缺少数据用指定字符代替 float_format:浮点数的格式,如float_format="%.2f"表示保留两位小数 header:是否导出列名称 index:是否把行的索引导出 index_label:导出行索引的那一列的列名 startrow、startcol:导出数据写入区域的左上角坐标 inf_rep:表示无穷大的表示字符串 freeze_panes:需传入一个二元元祖,表示窗口冻结的坐标 同一个Excel文件写入多个Sheet表格,需要用到pd.ExcelWriter()打开一个Excel文件 work=pd.ExcelWriter('demo.xlsx') #打开一个文件 data1.to_excel(work,sheet_name='sheet1') #写入数据到sheet1工作表 data2.to_excel(work,sheet_name='sheet2') #写入数据到sheet2工作表 work.save() #保存文件
to_csv(path_or_buf,sep=',',na_rep='',float_format=None,columns=None,header=True,index=True,index_label=None,mode='w',encoding='utf-8',chunksize=None, date_format=None,decimal='.')
path_or_buf:保存文件名或文件句柄 sep:输出文件的字段分隔符,长度为1的字符串。 na_rep:缺少数据用指定字符代替 float_format:浮点数的格式,如float_format="%.2f"表示保留两位小数 columns:保存的列组成的list header:是否导出列名称 index:是否把行的索引导出 index_label:指定导出索引的列名 mode:保存文件的打开方式 encoding:字符编码 line_terminator:指定换行符,默认为"os.linesep" chunksize:每次写入操作的写入行数 date_format:日期的格式,如:"%Y-%m-%d %H:%M:%S" decimal:字符识别十进制分隔符。使用','表示欧洲数据