首页 > python学习 > python中pandas模块的数据对象和数据透视
2020
03-05

python中pandas模块的数据对象和数据透视

我们一般都是预定将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:参数排序的列名组成的list

六、索引操作

索引重建

    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:字符识别十进制分隔符。使用','表示欧洲数据
最后编辑:
作者:qingheluo
这个作者貌似有点懒,什么都没有留下。

留下一个回复

你的email不会被公开。