一、简介
pandas 是基于NumPy 的一种工具,该工具是为解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。(摘自百度百科)
二、导入
pandas使用前需要导入
导入方式如下:
import pandas
import pandas as pd #pd为pandas的简称
from pandas import *
三、基本数据结构
1、Series
(1)简介
一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很相近。Series如今能保存不同种数据类型,字符串、bool值、数字等都能保存在Series中。
(2)创建一个Series
一维Series可用一维列表初始化:
import pandas as pd
s=pd.Series([1,2,3,4,5,6,7])
print(s)
注:空值可写为np.nan
输出结果为:
0 1
1 2
2 3
3 4
4 5
5 6
6 7
dtype: int64
其中第一列为索引,第二列为数据,最后一行输出的是数据类型。
(3)修改索引名称
默认情况下,Series的索引都是数字,也可使用额外参数指定
import pandas as pd
s=pd.Series([1,2,3,4,5,6,7],["a","b","c","d","e","f","g"])
print(s)
输出结果为:
a 1
b 2
c 3
d 4
e 5
f 6
g 7
dtype: int64
查看索引:s.index
修改索引:s.index=[name1,name2,…,namen]
设置索引总名称:s.index.name=" "
(3)值
查看所有值:s.values
取某个值:s[索引]
(4)切片
s[起点 : 终点(不包含): 步长]
2、DataFrame
(1)简介
二维的表格型数据结构。很多功能与R中的data.frame类似。可以将DataFrame理解为Series的容器。(摘自百度百科)
(2)创建一个DataFrame结构
可用二维列表初始化:
df=pd.DataFrame(二维数组,index=[行索引],columns=[列索引])
import pandas as pd
df=pd.DataFrame([[1,2,3,4,5],[6,7,8,9,10]],index=['a','b'],columns=[1,2,3,4,5])
print(df)
输出结果为:
1 2 3 4 5
a 1 2 3 4 5
b 6 7 8 9 10
第一列为行索引(index),第一行为列索引(columns)。
也可以用字典传入数据:
df=pd.DataFrame(字典,index=[行索引] )
字典的每个key代表一列,其value可以是各种能转化为Series的对象。
import pandas as pd
df=pd.DataFrame({'a':'test','b':[4,5,6]},index=[1,2,3],)
print(df)
输出结果为:
a b
1 test 4
2 test 5
3 test 6
与Series要求所有的类型都一致不同,DataFrame只要求每一列数据的格式相同
查看DataFrame内各列的数据类型:
df.dtypes
(3)查看数据
查看前面n行(默认为5行):df.head(n)
查看后面n行(默认为5行):df.tail(n)
(4)行索引,列索引,数据的查看
行索引:df.index
列索引:df.colunms
数据值:df.values
(5)读取数据
一般为excel文件,excel文件后缀为(.xlsx)
如果文件和Jupiter notebook在同一路径下:
df=pd.read_excel(‘文件名+后缀’)
如果路径不同,则需要加上路径:
df=pd.read_excel(r’路径’)
(6)行的操作
取某一行:
df.iloc[索引] df.loc[索引]
取几行:
df.iloc[起点:终点(不包含):步长]
df.loc[起点:终点(包含):步长]
添加一行:
s=pd.Series(字典)
s.name=行索引
df=df._append(s)
例如:
import pandas as pd
df=pd.DataFrame({'a':'test','b':[4,5,6,7,8]})
s=pd.Series({'a':'test','b':3})
s.name=5
df=df._append(s)
print(df)
运行后添加一行:
5 test 3
删除一行:
df=df.drop(行索引)
(7)列操作
查看某一列:
df[列索引][行起点:行终点(不包括)]
查看某几列:
df[[列索引1,列索引2,…,列索引n]]
增加一列:
df[列索引]=添加的内容
删除一列:
df=df.drop(列索引,axis=1)
(8)用索引取数据
df.loc[index,column]
df.loc[[index1,index2,…,indexn],[column1,column2,…,columnn]]
(9)条件选择
df[条件][行起点:行终点(不包括)]
注:与&
或|
(10)缺失值及异常值的处理
dropna:对标签中的缺失值进行过滤,删除缺失值
fillna:对缺失值进行补充
isnull:返回一个布尔值,判断那些值是缺失值
notnull:isnull的否定式
判断缺失值:
df[列索引].isnull()
填充缺失值:
df[列索引].fillna(填充数据,inplace=True)
删除缺失值:
df.dropna()
括号内可填:
how=‘all’:删除全为空值的行或列
inplace=True:覆盖之前的数据
axis=0,axis=1:选择删除行或列,默认为0
处理异常值:
df=df[条件]
删除行后改索引:
df.index=range(len(df))
替换数据:
df[索引].replace(原数据,新数据,inplace=True)
df[索引].replace([原数据1,…,原数据n],[新数据1,…,新数据n],inplace=True)
注:切片使用引用机制,若在切片内替换数据,需要在截取数据的语句后加一个.copy()复制一份数据给df。
import pandas as pd
df=pd.read_excel(r'C:\Users\Desktop\课程中用到的数据\film.xlsx')
df1=df[:6].copy()
df1['首映地点'].replace('美国','usa',inplace=True)
print(df1)
(11)数据保存
df.to_excel(‘文件名+后缀’)
(12)数据格式转化
查看格式:
df[索引].dtype
改变格式:
df[索引]=df[索引].astype(目标格式)
(13)排序
按值排序:
df.sort_values(by=索引)
默认升序,若要改为降序:
df.sort_values(by=索引,ascending=False)
多个值排序:
df.sort_values(by=[索引1,索引2,…])
先按索引1排,再按索引2排,以此类推
四、基本统计分析
1、描述性统计
df.describe()
能提供一系列统计数据,有助于发现一些异常值
2、求一些常用的统计数据
功能 | 语法 |
---|---|
求最大值 | df[索引].max() |
求最小值 | df[索引].min() |
求均值 | df[索引].mean() |
求中值 | df[索引].median() |
求方差 | df[索引].var() |
求标准差 | df[索引].std() |
求和 | df[索引].sum() |
求相关系数 | df[[索引1,索引2]].corr() |
求协方差 | df[[索引1,索引2]].cov() |
计数 | len(df) |
统计唯一值 | len(df[索引].unique()) |
对唯一值出现的次数进行计数 | df[].value_counts() |
五、数据透视
1、基础形式
pd.pivot_table(df,index=[索引] )
(1)默认进行均值运算,但也可以指定函数来统计不同数值:
pd.pivot_table(df,index=[],aggfunc=函数)
对不同值执行不同函数:
pd.pivot_table(df,index=[ ],values=[ ],aggfunc={索引1:函数,…,索引n:函数})
(2)也可指定需要汇总的数据:
pd.pivot_table(df,index=[索引],values=[索引])
2、查看所有结果
当处理数据过多时会进行省略,如果想查看所有数据时:
设置最多显示n列:pd.set_option(‘max_.columns’,n)
设置最多显示n行:pd.set_option(‘max_.rows’,n)
3、处理非数值(NaN)
可使用fill_value将其设置为0:
pd.pivot_table(df,index=[ ],fill_value=0)
4、显示总和数据
添加margins=True可在下方显示一些总和数据
pd.pivot_table(df,index=[],margins=True)
六、数据重塑和轴向旋转
1、Series的层次化索引
s=pd.Series([ ],index=[[大索引],[小索引]])
例如:
import pandas as pd
s=pd.Series([1,2,3,4,5,6],index=[['a','a','a','b','b','b'],[1,2,3,1,2,3]])
print(s)
输出结果为:
a 1 1
2 2
3 3
b 1 4
2 5
3 6
dtype: int64
其中ab为大索引,123为小索引
取值:
s[大索引] :取大索引下的值
s[:,1] :取每个大索引的第一行
s[大索引][小索引]
2、DataFrame的层次化索引
df=pd.DataFrame([ ],index=[[大索引],[小索引]],columns=[[大索引],[小索引]])
import pandas as pd
df=pd.DataFrame([[1,2,3],[6,7,8],[4,5,0]],index=[['一','一','二'],[1,2,1]],columns=[['a','b','b'],[1,1,2]])
print(df)
输出结果为:
a b
1 1 2
一 1 1 2 3
2 6 7 8
二 1 4 5 0
其中一二为行的大索引,12为行的小索引,ab为列的大索引,12为列的小索引
也可以为行和列的大索引和小索引命名:
为行索引命名:df.index.names=[名称1,名称2]
为列索引命名:df.columns.names=[名称1,名称2]
import pandas as pd
df=pd.DataFrame([[1,2,3],[6,7,8],[4,5,0]],index=[['一','一','二'],[1,2,1]],columns=[['a','b','b'],[1,1,2]])
df.index.names=['row1','row2']
df.columns.names=['col1','col2']
print(df)
输出结果为:
col1 a b
col2 1 1 2
row1 row2
一 1 1 2 3
2 6 7 8
二 1 4 5 0
运行后row1为行的大索引的总称,row2为行的小索引的总称,col1为列的大索引的总称,col2为列的小索引的总称。
利用这些总称可以调换索引的位置:
df=df.swaplevel(索引总称1,索引总称2)
把列变为索引:df=df.set_index([列名称])
把索引变为列:df=df.reset_index([索引名])
取消层次化索引:df=df.reset_index()
每个索引都是一个元组,可用df.index()查看
数据旋转:df.T可直接让数据行列进行交换
3、Series与DataFrame的互换
(1)将Series变为DataFrame:s.unstack()
import pandas as pd
s=pd.Series([1,2,3,4,5,6],index=[['a','a','a','b','b','b'],[1,2,3,1,2,3]])
s=s.unstack()
print(s)
输出结果为:
1 2 3
a 1 2 3
b 4 5 6
大索引变行索引,小索引变列索引
(2)将DataFrame变为Series:df.stack()
import pandas as pd
df=pd.DataFrame([[1,2,3],[6,7,8],[4,5,0]],index=[['一','一','二'],[1,2,1]],columns=[['a','b','b'],[1,1,2]])
df=df.stack()
print(df)
输出结果为
a b
一 1 1 1.0 2
2 NaN 3
2 1 6.0 7
2 NaN 8
二 1 1 4.0 5
2 NaN 0
行索引变大索引,列索引变小索引
注:转化有可能造成空值出现
七、数据分组与分组运算
GroupBy技术:实现数据分组和分组运算,作用类似于数据透视表
1、分组
group=df.groupby(分组依据)
也可传入多个分组变量:
group=df.groupby([分组依据1,分组依据2])
2、计算分组后的各个统计量
group.mean()等
注:只会对数值变量进行分组运算,如数据不需运算,可设置为字符串
八、离散化处理
离散化也可称为分组、区间化
pd.cut(x,bins,right=True,labels=None,retbns=False,precision=3,include_lowest=False)
x:需要离散化的数组、Series、DataFrame对象
bins:分组依据
right=True:是否包含右端点,默认为True,即包含
labels=None:定义区间名称
retbns=False:是否返回每个对应bins的列表
precision=3:精度设置
include_lowest=False:是否包含左端点,默认为False,即不包含
例:
df1=pd.cut(df['评分'],[0,3,5,7,9,10],labels=['E','D','C','B','A'])
解释:评分(0,3]为E,(3,5]为D,(5,7]为C,(7,9]为B,(9,10]为A
九、合并数据集
1、append
append可以将两个数据集进行上下拼接
df1.append(df2)
2、merge
pd.merge(left,right,how='inner',on=None,left_on=None,right_on=None,left_index=False,right_index=False,sort=True,suffixes=('_x','_y'))
left/right:对象
how=‘inner’:取交集
on:连接处,必须是left,right中都有的列
left_on:用从left中选取的列作连接处
right_on:用从right中选取的列作连接处
left_index:将左侧行索引用作其连接键
right_index:将右侧行索引用作其连接键
sort=True:根据连接键对合并后的数据进行排序,默认为 True 。有时在处理大数据集时,禁用该选项可获得更好的性能
suffixes=('x’,'y’):字符串值元组,用于追加到重叠列名的末尾,默认为(’ x ‘;,’ y ')。例如,如果左右两个 DataFrame 对象都有" data “,则结果中就会出现” data _ x “和” data _ y "
3、concat
concat可将多个数据集进行批量合并
df=pd.concat([df1,df2,df3],axis=0)
axis默认为0,即增加行
改为1则增加列