注册 登录

清河洛

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

qingheluo2020-03-05清河洛417
我们一般都是预定将pandas库加载为pd(import pandas as pd),这种方式也是官网推荐的方式。pandas模块依赖于numpy模块(在pip安装pandas时会自动安装),也需要引入import numpy as nppandas的数据结构有Series和DataFrameSeries是一维数据结构 DataFrame表示为具有行和列的二维数据 DataFrame的每个column就是一个Series 一、创建数据对象创建Series数据Series(data=None,index=None,dtype=None,name=None)data:创建的Series对象的...

我们一般都是预定将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_excel(file_name, sheet_name = 0, header = 0, names=None, index_col = None, usecols=None, dtype: = None, converters=None, true_values: = None, false_values = None, skiprows = None, na_values=None, na_filter = True, mangle_dupe_cols: = True)

sheet_name:指定要读取数据的工作表
    为str,表示sheet名称
    为int,表示sheet的索引
    为list表示同时读取多张工作表,list中可以int和str混合
    设为None表示获取所有工作表
header:指定标题的行索引,传入None表示没有标题
names:传入list,手动设定列名称,必须指定header为None
index_col:指定用作索引的列索引值
usecols:要读取的excel中的列,为None表示读取所有列
    为str,则以"C:F"或"C:F,G:H,M"
    为int表示解析的列的索引
    为list(元素可以为int或str)表示读取指定列
    为func则会将列名称一次传入函数,读取函数返回True的列
dtype:以dict格式指定列的数据类型,key为列明,value为数据类型
    dtype={
        "年":numpy.int32,
        "电量":numpy.float64
    }
converters:以dict格式传入列的数据处理函数,读取为函数处理后的值
    converters={
        "年":int,
        "电量":math.floor
    }
true_values:list,要视为True的值
false_values:list,要视为False的值
skiprows:读取数据时跳过的行
    为int表示跳过前int行
    为list,表示要跳过的行数
    为func则一次将行索引传入函数,返回True表示跳过改行
na_values:要识别为NaN的值
    传入str或str组成的数组表示具体识别为NaN的值
    传入dict表示key列要识别为NaN的值
    默认将'#N/A'、'#NA'、'N/A'、'NA'、'NULL'、'NaN'等识别为NaN
na_filter:bool值,表示读取数据时是否解析空字符串和na_values值,设为False能提高大文件读取性能
mangle_dupe_cols:是否自动重命名重复列名,如多列X列会重命名"X"、"X.1"、"X.2"、...、"X.n"

read_csv(file_name,, sep=',', header='infer',engine="c" names=None, index_col=None, usecols=None, prefix="", mangle_dupe_cols=True, dtype: = None, converters=None, true_values=None, false_values=None, skipinitialspace=False, skiprows=None, na_values=None, na_filter=True, skip_blank_lines=True, chunksize=None, lineterminator=None, comment=None, encoding=None, encoding_errors: = 'strict', on_bad_lines=None, delim_whitespace=False, low_memory=True)

header:用作列名的行索引,默认'infer'表示自动推断
engine:要使用的分析器引擎('c'或者'python')
prefix:当列名重复时添加的前缀
skipinitialspace:是否跳过分隔符后的空格
skip_blank_lines:是否跳过空行,不跳过则所有字段解析为NaN
comment:以指定字符开头的行将被忽略
encoding:指定csv编码
encoding_errors:str值,如何处理编码错误,可选值
    "strict"表示严格模式,直接报错停止
    "ignore"表示宽松模式,会忽略错误继续向下读取
on_bad_lines:str值,遇到错误的行该怎么处理
    error,引发异常。
    warn,发出警告并跳过该行
    skip,跳过错误行而不引发或发出警告
delim_whitespace:使用空格作为分隔符,多个连续的空格被认为是一个空格
low_memory:是否以块形式处理文件从而降低内存使用

read_sql(sql, con, index_col = None, coerce_float: = True, params=None, parse_dates=None, columns=None, chunksize = None)

coerce_float:是否尝试解析非str和非int的值为float
columns:list值,手动指定列名

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']]:根据列名选择多列(两个中括号)
data.iloc[rows,columns]:根据数字索引获取指定的行或列

获取行或列都必须使用数字索引来获取
rows:指定的行,可以为一个数字或切片((start_rowx:end_rowx))
columns:指定的列,可以为一个数字或数字组成的list([colx1,colx2,colx3...])

data.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
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('.','-'))

插入新列

DataFrame.insert(loci, col_name, value,allow_duplicates = False)
    在指定的列索引loci处插入新列,列名称为col_name,该位置及之后的列会统一右移
    value该列的值,如果为一个值则所有的行都会赋值为该值,也可以是列表
    allow_duplicates表示是否允许列名重复,默认False在重复时会抛出异常
DataFrame[new_col_name] = value
    直接使用索引赋值插入新列,会插入到末尾,不能选择插入的位置

五、数据排序

索引排序
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数据,通常用文件导入
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:字符识别十进制分隔符。使用','表示欧洲数据

to_sql(table, con, if_exists = 'fail', index = True, index_label=None, chunksize=None, dtype: = None, method=None)

if_exists:'fail', 'replace', 'append'
index:是否将索引以"index_label"列名写入数据库
index_label:手动指定索引的列名
chunksize:每次写入的行数,默认为一次全部写入
dtype:以一个字典的形式设置各个字段的数据类型
    dtype={
        "年份":"INTEGER",
        "电量":"REAL"
    }
    不指定的字段会自动根据数据识别数据类型
method:数据插入的方式,默认None表示一个insert语句插入一行,如果为"multi"则一个insert语句插入多行


网址导航