pandas统计分析
pandas主要包括两个数据结构,即Series对象和DataFrame对象,本章主要介绍如何导入外部数据、数据抽取、以及数据的增加、修改、删除,还包括数据清洗、索引设置、数据排序与排名等,为后续数据处理和数据分析打下良好的基础。
pandas
pandas简介
pandas是python的核心数据分析库,能够简单、直观、快速的处理各种类型的数据。
pandas能够处理以下类型的数据:
- 与SQL或Excel表类似的数据
- 有序和无序(非固定频率)的时间序列数据
- 带行、列标签的矩阵数据
- 任意其他形式的观测、统计数据集
pandas优势:
- 能够处理浮点与非浮点数据里的缺失数据,表示为NaN
- 大小可变,可以插入或删除DataFrame等多维对象的列。
- 自动、显式数据对齐,显式的将对象与一组标签对齐,也可以忽略标签,在Series、DataFrame计算时自动与数据对齐
- 强大灵活的分组统计(groupby)功能,即数据聚合、转换
- 可以将python和numpy数据机构里不规则、不同索引的数据轻松的转化为DataFrame对象
- 智能标签,对大型数据集进行切片、花式索引、子集分解等操作
- 直观地合并(merge)、连接(join)数据集
- 灵活的重塑(reshape)、透视(pivot)数据集
- 成熟的导入、导出工具,导入导出各种格式文件。
- 时间序列:支持日期范围生成、频率转换、移动窗口统计、移动窗口线性回归、日期位移等时间序列功能。
pandas安装
1.常见可以使用pip工具安装:
pip install Pandas
2.pycharm安装
pycharm中点击File→Settings,打开Settings窗口,选择Project Interpreter,然后单击+按钮,此时打开了Available Package窗口,然后搜索需要添加的包名(此时是pandas),然后单击install package即可安装。
notice:有时需要解决依赖关系,在安装pandas时还需要安装xlrd,xlwt库来解决依赖关系。
导入excel数据
首先导入模块,然后导入相应的文件名即可
import pandas as pd #导入pandas模块
df = pd.read_excel('路径文件名') #读取excel文件
df1 = df.head() #前五条数据
df1 #显示df1
在jupyter notebook中点击运行上述代码,即可显示df1的数据。
Series对象
Series是一维数据,而DataFrame是带标签的、大小可变的二维数据。
创建Series对象:
s= pd.Series(data,index = index)
参数说明:
- data:表示数据,可以是字典、多维数组、标量
- index:行标签(索引)
- 返回值:Series对象
例:
import pandas as pd
s1 = pd.Series([88,60,75])
print(s1)
结果:
手动设置Series索引
import pandas as pd
s1 = pd.Series([88,60,75],index=[1,2,3])
s2 = pd.Series([88,60,75],index=['a','b','c'])
print(s1)
print(s2)
Series索引
Series位置索引
位置索引默认是从0开始数,[0]是Series的第一个数
import pandas as pd
s1 = pd.Series([88,60,75])
print(s1[0])
结果为88
Series标签索引
Series标签索引与位置索引类似,index的数据类型是字符串,如果需要获取多个标签值索引,需要用[[]]来表示。
import pandas as pd
s2 = pd.Series([88,60,75],index=['a','b','c'])
print(s2['a'])
print(s2[['a','b']])
Series切片索引
用标签索引做切片,包含索引开始的位置,也包含索引结束的位置。
用位置索引做切片,包含索引开始的位置,不包含索引结束的位置。
s2 = pd.Series([88,60,75],index=['a','b','c'])
print(s2['a':'c'])
s2 = pd.Series([88,60,75],index=['a','b','c'])
print(s2[0:2])
获取Series索引和值
获取Series索引和值主要使用Series的index和values方法。
s2 = pd.Series([88,60,75])
print(s2.index)
print(s2.values)
DataFrame对象
DataFrame是一个二维表数据结构,由行、列数据组成的表格,既有行索引也有列索引。在DataFrame中,用index表示行或用columns表示列。
遍历DataFrame数据,输出每一列数据:
import pandas as pd
data = [[110,105,99],[105,88,115],[109,120,130]]
index = [0,1,2]
columns = ['a','b','c']
#创建DataFrame数据
df = pd.DataFrame(data = data,index=index,columns=columns)
print(df)
#遍历DataFrame数据的每一列
for col in df.columns:
series = df[col]
print(series)
创建DataFrame对象
创建DataFrame对象主要使用pandas的DataFrame方法:
pandas.DataFrame(data,index,columns,dtype,copy)
参数说明:
- data:数据,可以是ndarray数组,Series对象、列表、字典等
- index:行索引
- columns:列索引
- dtype:每一列的数据类型
- copy:用于复制数据
- 返回值:DataFrame
表1 数据类型对应表
pandas dtype | python type |
---|---|
object | str |
int64 | int |
float64 | float |
bool | bool |
datetime64 | datetime64[ns] |
timedelta[ns] | NA |
category | NA |
使用二维数组创建DataFrame
import pandas as pd
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width',True)
data = [[110,105,99],[105,88,115],[109,120,130]]
columns = ['语文','数学','英语']
df = pd.DataFrame(data = data,columns=columns)
df
字典创建DataFrame
在使用字典创建DataFrame时,字典的value值只能是一维数组或单个的简单数据类型,如果是数组,要求所有数组长度一致,如果是单个数据,则每行都添加相同数据。
例:
import pandas as pd
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width',True)
df = pd.DataFrame({
'语文':[110,105,99],
'数学':[105,88,115],
'英语':[109,120,130],
'班级':'高一7班'
},index = [0,1,2])
df
DataFrame重要属性和函数
表2 重要属性
属性 | 描述 | 举例 |
---|---|---|
values | 查看所有元素的值 | df.values |
dtypes | 查看所有元素的类型 | df.dtypes |
index | 查看所有行名、重命名行名 | df.index;df.index=[1,2,3] |
columns | 查看所有列名、重命名行名 | df.columns;df.columns= ['a','b','c'] |
T | 行列数据互换 | df.T |
head | 查看前n条数据,默认5条 | df.head();df.head(10) |
tail | 查看后n条数据,默认5条 | df.tail();df.tail(10) |
shape | 查看行数和列数,[0]表示行,[1]表示列 | df.shape() df.shape[1] |
info | 查看索引,数据类型和内存信息 | df.info |
describe | 查看每列的统计汇总信息,DataFrame类型 | df.describe() |
count | 返回每一列中的非空值的个数 | df.count() |
sum | 返回每一列的和,无法计算返回空值 | df.sum() |
max | 返回每一列的最大值 | df.max() |
min | 返回每一列的最小值 | df.min() |
argmax | 返回最大值所在的自动索引的位置 | df.argmax() |
argmin | ||
idxmax | 返回最大值所在的自定义索引的位置 | df.idxmax |
idxmin | ||
mean | 返回每一列的平均值 | df.mean() |
median | 返回每一列的中位数 | df.median() |
var | 返回每一列的方差 | |
std | 返回每一列的标准差 | |
isnull | 检查df中的空值,空值为True,返回为布尔型数组 | |
notnull | 检查df中的空值,空值为False |
导入外部数据
使用pandas的read_excel()方法导入.xls或.xlsx文件
语法如下:
pandas.read_excel(io,sheet_name=0,header=0,names=None,index_col=None,usecols=None,squeeze=False, dtype=None,engine=None,converters=None,true_values=None,false_values=None,skiprows=None,nrow=None, na_values=None,keep_default_na=True,verbose=False,parse_dates=False,date_parser=None,thousands=None, comment=None,skipfooter=0,conver_float=True,mangle_dupe_cols=True,**kwds)
参数说明:
- io:字符串,指文件路径
- sheet_name:None、字符串、整数、字符串列表或整数列表,默认值为0。字符串用于工作表名称,整数为索引表示工作表位置,字符串列表或整数列表用于请求多个工作表,为None时获取所有工作表。
- header:指定作为列名的行,默认为0,即第一行的值为列名若数据不包含列名,可以设置header = None
- names:默认值为None,要使用的列名列表
- index_col:指定列位索引列,默认是None,索引0是DataFrame的行标签
- usecols:int、list列表或字符串,默认值是None
- squeeze:布尔值,默认值是False,如果解析的数据只包含一列,则返回一个Series
- dtype:列的数据类型名称或字典,默认值是None
- skiprows:省略指定行数的数据,从第一行开始
- skipfooter:省略指定行数的数据,从尾部数的行开始
导入excel
import pandas as pd
df= pd.read_excel('路径文件名')
df1 = df.head() #输出前五条数据
导入指定的sheet的页
import pandas as pd
df= pd.read_excel('路径文件名',sheet_name = '工作表名称')
df1 = df.head() #输出前五条数据
通过行、列索引导入指定行、列数据
#指定行索引
import pandas as pd
df= pd.read_excel('路径文件名',index_col = 0)#指定第一列为行索引
df1 = df.head() #输出前五条数据
#指定列索引
import pandas as pd
df= pd.read_excel('路径文件名',header = 1)#指定第一行为列索引
df1 = df.head() #输出前五条数据
#指定列索引为数字
import pandas as pd
df= pd.read_excel('路径文件名',header = None)#列索引为数字
df1 = df.head() #输出前五条数据
导入指定列数据
#导入第一列数据
import pandas as pd
df= pd.read_excel('路径文件名',usecols = [0])#导入第一列
df1 = df.head() #输出前五条数据
#导入多列数据
import pandas as pd
df= pd.read_excel('路径文件名',usecols = [0,3])#导入第一列和第四列
df1 = df.head() #输出前五条数据
#导入指定列名称
import pandas as pd
df= pd.read_excel('路径文件名',usecols = ['a','b'])#导入第一列和第四列
df1 = df.head() #输出前五条数据
导入.csv文件
pd.read_csv(filepath_or_buffer: Union[ForwardRef('PathLike[str]'), str, IO[~T], io.RawIOBase, io.BufferedIOBase, io.TextIOBase, _io.TextIOWrapper, mmap.mmap], sep=<object object at 0x000002897B8E6DF0>, delimiter=None, header='infer', names=None, index_col=None, usecols=None, squeeze=False, 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, parse_dates=False, infer_datetime_format=False, keep_date_col=False, date_parser=None, dayfirst=False, cache_dates=True, iterator=False, chunksize=None, compression='infer', thousands=None, decimal: str = '.', lineterminator=None, quotechar='"', quoting=0, doublequote=True, escapechar=None, comment=None, encoding=None, dialect=None, error_bad_lines=True, warn_bad_lines=True, delim_whitespace=False, low_memory=True, memory_map=False, float_precision=None, storage_options: Optional[Dict[str, Any]] = None)
常用参数:
- filepath_or_buffer:字符串,文件路径,也可以是URL链接
- sep、delimiter:字符串,分隔符
- header:指定作为列名的行,默认为0,即第一行的值为列名若数据不包含列名,可以设置header = None
- names:默认值为None,要使用的列名列表
- index_col:指定列位索引列,默认是None,索引0是DataFrame的行标签
- usecols:int、list列表或字符串,默认值是None
- dtype:列的数据类型名称或字典,默认值是None
- parse_dates:布尔类型值、int类型值的列表、列表或字典,默认值为False
- encodding:字符串,默认为None,文件的编码格式
- 返回值:返回一个DataFrame
import pandas as pd
df1 = pd.read_csv('路径文件名',encoding = 'gbk') #导入.csv文件,并指定编码格式
df1 = df1.head() #输出前5条数据
导入.txt文本文件
导入.txt文件也是使用read_csv()方法,只是修改sep参数为sep = '\t'
import pandas as pd
df1 = pd.read_csv('路径文件名',sep = '\t',encoding = 'gbk')
df1 = df1.head()
df1#输出前5条数据
导入HTML网页
使用read_html()方法,主要用于导入带有table标签的网页表格数据:
pd.read_html(io: Union[ForwardRef('PathLike[str]'), str, IO[~T], io.RawIOBase, io.BufferedIOBase, io.TextIOBase, _io.TextIOWrapper, mmap.mmap], match: Union[str, Pattern] = '.+', flavor: Optional[str] = None, header: Union[int, Sequence[int], NoneType] = None, index_col: Union[int, Sequence[int], NoneType] = None, skiprows: Union[int, Sequence[int], slice, NoneType] = None, attrs: Optional[Dict[str, str]] = None, parse_dates: bool = False, thousands: Optional[str] = ',', encoding: Optional[str] = None, decimal: str = '.', converters: Optional[Dict] = None, na_values=None, keep_default_na: bool = True, displayed_only: bool = True) -> List[pandas.core.frame.DataFrame]
常用参数说明:
- io:字符串,文件路径,也可以是URL链接
- match:正则表达式,返回与正则表达式匹配的表格
- flavor:解析器默认为lxml
- header:指定列标题所在的行,列表list为多重索引
- index_col:指定行标题对应的列,列表list为多重索引
- encoding:字符串,默认为None,文件的编码格式
- 返回值:返回一个DataFrame。
例:
import pandas as pd
df = pd.DataFrame()
url_list = ['http://www.espn.com/nba/salaries']
for i in range(2,13):
url = 'http://www.espn.com/nba/salaries/_/page/%s'%i
url_list.append(url)
#遍历网页中的table读取网页表格数据
for url in url_list:
df = df.append(pd.read_html(url),ignore_index = True)
#列表解析:遍历DataFrame第3列,以子字符串$开头
df = df[[x.startswith('$') for x in df[3]]]
df.to_csv('NBA.csv',header = ['RK','NAME','TEAM','SALARY'],index = False)#导出csv文件
最后得到一个csv文件:
3.5 数据抽取
在DataFrame中,主要使用loc属性和iloc属性抽取数据(即选取想要的部分数据)
两者的区别:
- loc属性:以列名和行名作为参数,当只有一个参数时,默认是行名,即抽取整行数据,包括所有列
- iloc属性:以行和列位置为索引(即0,1,2....)作为参数,0表示第一行,1表示第二行。当只有一个参数时,默认是行索引,即抽取整行数据,包括所有列。
抽取一行数据
主要使用loc属性
import pandas as pd
data = [[110,105,99],[105,88,115],[109,120,130],[112,115,110]]
name = ['a','b','c','d']
columns = ['语文','数学','英语']
df = pd.DataFrame(data = data,index = name,columns=columns)
df1 = df.loc['a']
df1
使用iloc抽取第一行数据,指定行索引即可
抽取多行数据
抽取任意多行数据
通过loc和iloc属性指定行名和行索引即可实现抽取任意多行数据
抽取连续任意多行数据
在loc和iloc中合理的使用冒号(:)即可抽取连续任意多行数据
抽取指定列数据
#直接使用列名
import pandas as pd
data = [[110,105,99],[105,88,115],[109,120,130],[112,115,110]]
name = ['a','b','c','d']
columns = ['语文','数学','英语']
df = pd.DataFrame(data = data,index = name,columns=columns)
df1 = df[['语文','数学']]
df1
#使用loc属性和iloc属性
print(df.loc[:,['语文','数学']])#抽取语文和数学
print(df.iloc[:,[0,1]])#抽取第一列和第二列
按指定条件抽取数据
DataFrame对象实现数据查询有以下三种方式:
- 取其中的一个元素
- 基于位置的查询
- 基于行名、列名的查询
例:
import pandas as pd
data = [[110,105,99],[105,88,115],[109,120,130],[112,115,110]]
name = ['a','b','c','d']
columns = ['语文','数学','英语']
df = pd.DataFrame(data = data,index = name,columns=columns)
df1 = df.loc[(df['语文']>105)&(df['数学']>88)]
df1
数据的增删改查
增加
- 直接为DataFrame对象赋值
- 使用loc属性在DataFrame对象的最后增加一列
- 在指定位置插入一列,使用pd.insert()方法
- 使用loc属性增加一行数据
- 字典结合append方法来实现增加多行数据
例:
import pandas as pd
data = [[110,105,99],[105,88,115],[109,120,130],[112,115,110]]
name = ['a','b','c','d']
columns = ['语文','数学','英语']
df = pd.DataFrame(data = data,index = name,columns=columns)
#直接为DataFrame对象赋值
df['物理'] = [88,79,60,50]
#使用loc属性在DataFrame对象的最后增加一列
df.loc[:,'物理']=[88,79,60,50]
#在指定位置插入一列,使用pd.insert()方法
wl = [88,79,60,50]
df.insert(1,'物理',wl)
#使用loc属性增加一行数据
df.['e']= [100,120,99]
#字典结合append方法来实现增加多行数据
df_insert = pd.DataFrame({'语文':[100,123,138],'数学':[99,142,60],'英语':[98,139,99]},index = ['e','f','g'])
df1 = df.append(df_insert)
修改
- 修改列标题使用DataFrame中的columns属性
- 修改行标题使用DataFrame中的index属性即可
- 修改数据主要使用DataFrame中的loc和iloc属性
例:
df.columns = ['云纹','sdf','sd2']
df.index = list('1234')
df.rename({'a':1,'b':2,'c':d,axis = 0,inplace = True})
删除
删除数据主要使用drop方法
drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')
主要参数:
- labels:表示行标签或列标签
- axis:axis= 0,表示按行删除,axis = 1,表示按列删除。默认按行删除
- index:删除行
- columns:删除列
- level针对有两级索引的数据
- inplace:可选参数,对原数组做出修改并返回一个新数组。如果值为True,则原数组直接被替换
- errors:参数值为ignore或raise,如果为ignore,则取消错误。
删除行、列数据:
df.drop(['数学'],axis=1,inplace=True) #删除某列
df.drop(columns='数学',inplace=True) #删除columns为“数学”的列
df.drop(labels='数学', axis=1,inplace=True) #删除列标签为“数学” 的列
df.drop(['明日','二月二'],inplace=True) #删除某行
df.drop(index='明日',inplace=True) #删除index为“明日”的行
df.drop(labels='明日', axis=0,inplace=True) #删除行标签为“明日”的行
数据清洗
缺失值查看与处理
缺失值是由于某种原因导致数据为空,一般处理方式有不处理、删除、填充/替换、插值(用均值/中位数/众数等填补)。
查看缺失值可以使用df.info()方法,然后通过查看各指标非空数量是否一致。
通过isnull()方法和notnull()方法来判断是否有缺失值
df.info()
df.isnull()
df.notnull()
缺失值删除处理
在得知存在数据缺失情况后,可以使用dropna方法删除含有缺失值的行
df1 = df.dropna()
有些数据虽然存在缺失值,但是不影响数据分析,则可以使用以下代码:
df2= df[df['字段'].notnull()]
重复值处理
对于数据中重复的行或者几行中某几列的值重复一般做删除处理,主要使用drop_duplicates()
#判断一行数据是否重复(完全相同),返回值为False表示没有重复,True表示重复
df1.duplicated()
#取出全部的重复数据
df1.drop_duplicates()
#去除指定列的重复数据
df1.drop_duplicates(['列名'])
#保留重复行中的最后一行
df1.drop_duplicates(['列名'],keep = 'last')
#直接删除,保留一个副本
df1.drop_duplicates(['列名'],inplace = False)
#inplace = True表示直接在原来的DataFrame上删除重复项,而默认值false表示删除重复项后生成一个副本。
异常值的检测与处理
异常值是指超出或低于正常范围的值,检测方法主要如下:
- 根据给定的范围进行判断,不在范围内的数据视为异常值
- 均方差:统计学中,如果一个数据分布近似于正态分布。
- 箱线图:该图是将数据通过四分位数的形式进行图形化描述,超过上限或下限的数据都可以认为是异常值。
异常值常见处理方法如下:
- 删除
- 将异常值当做缺失值处理,以某个值填充
- 将异常值当做特殊情况进行分析,研究异常值出现的原因。
索引设置
索引的作用
索引能够使我们快速找到所需的内容,pandas索引的作用主要有:
方便查询数据
-
使用索引可以提升查询性能
- 如果索引是唯一的,pandas会使用哈希表优化,查找数据的时间复杂度为O(1)
- 如果索引不是惟一的,但是有序,则pandas会使用二分查找算法,查找数据的时间复杂度为O(logN)
- 如果索引是完全随机的,那么每次查询都要扫描数据表,查找数据的时间复杂度为O(N)
自动的数据对齐功能
-
强大的数据结构
- 基于分类数的索引,提升性能
- 多维索引,用于groupby多维聚合结果等
- 时间类型索引,强大的日期和时间的方法支持。
重新设置索引
使用reindex可以创建一个适应新索引的新对象。
DataFrame.reindex(labels = None,index= None,columns = None,axis = None,method = None,copy = True,level = None,fill_value = nan,limit = None,tolerance = None)
常用参数:
- labels:标签,可以是数组,默认为None
- index:行索引
- columns:列索引
- axis:轴,axis = 0表示行,axis= 1 表示列
- method:默认为None,重新设置索引时,选择插值(一种填充缺失数据的方法)方法,其值可以是None,bfill/backfill(向后填充)、ffill/pad(向前填充)等。
- fill_value:缺失值要填充的数据。如缺失值不用NaN填充,而用0填充,则设置fill_value = ()即可。
对Series对象重新设置索引
import pandas as pd
s1 = pd.Series([88,60,75],index = [1,2,3])
print(s1)
print(s1.reindex([1,2,3,4,5]))
如果不想用NaN填充数据,则可以为fill_value参数指定值,如0
s1.reindex([1,2,3,4,5],fill_value= 0)
对DataFrame对象重新设置索引
也是使用reindex方法去设置,同时设置行、列索引时需要传入参数index = ,columns
import pandas as pd
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width',True)
data= [[110,105,99],[105,88,115],[109,120,130]]
index = ['mr001','mr003','mr005']
columns = ['语文','数学','英语']
df = pd.DataFrame(data = data,index = index,columns = columns)
print(df)
#重新设置行索引
df.reindex(['mr001','mr002','mr003','mr004','mr005'])
#重新设置列索引
df.reindex(columns=['语文','物理','数学','英语'])
#重新设置行、列索引
df.reindex(index =['mr001','mr002','mr003','mr004','mr005'],columns=['语文','物理','数学','英语'])
设置某列为行索引
可以通过set_index方法设置某列作为行索引
df2 = df.set_index(['列名'])
数据清洗后重新设置连续的行索引
可以使用reset_index()方法设置
执行以下代码:
df2 = df.dropna().reset_index(drop = True)
数据排序与排名
数据排序
DataFrame数据排序主要使用sort_values()方法,该方法类似于sql中的order by。
sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last', ignore_index=False, key: 'ValueKeyFunc' = None)
参数说明:
- by:要排序的名称列表
- axis:轴,0代表行,1代表列,默认是0
- ascending:升序或者降序,布尔值,指定多个排序就可以使用布尔值列表,默认是True
- inplace:布尔值,默认是False,如果值为True,则就地排序
- kind:指定排序算法,值为quicksort(快速排序)、mergesort(混合排序)或heapsort(堆排),默认值为quicksort
- na_position:空值(NaN)的位置,值为first空值在数据开头,值为last空值在数据最后,默认为last
- ignore_index:布尔值,是否忽略索引,值为True标记索引(从0开始按顺序的整数值),值为False则忽略索引。
排序:
- 按一列排序
- 按多列排序
- 对统计结果排序
- 按行排序
import pandas as pd
excel_file = 'mrbook.xlsx'
df = pd.DataFrame(pd.read_excel(excel_file))
df.head()
#按‘销量’列降序排序
df = df.sort_values(by = '销量',ascending=False)
df.head()
#按多列排序
df1 = df.sort_values(by =['图书名称','销量'])
df1.head()
#对统计结果排序
df1 = df.groupby(['类别'])['销量'].sum().reset_index()
df2 = df1.sort_values(by = '销量',ascending=False)
df2.head()
#按行数据 排序
df = df.sort_values(by = 0,ascending = True,axis = 1)
df.head()
数据排名
排名是根据Series对象或DataFrame的某几列的值进行排名,主要使用rank()方法
rank(axis=0, method: 'str' = 'average', numeric_only: 'Optional[bool_t]' = None, na_option: 'str' = 'keep', ascending: 'bool_t' = True, pct: 'bool_t' = False)
参数说明:
axis:轴,axis=0表示行,axis = 1表示列,默认为0,即按行排序
-
method:表示在具有相同值的情况下所使用的排序方法。设置值如下:
- average:默认值,平均排名
- min:最小值排名
- max:最大值排名
- first:按值在原始数据中的出现顺序分配排名
- dense:密集排名,类似最小值排名,但是排名每次只增加1,即排名相同的数据只占一个名次
numeric_only:对于DataFrame对象,如果设置值为True,则只对数字列进行排序。
-
na_option:空值的排序方式,设置值如下。
- keep:保留,将空值等级赋给NaN的值
- top:如果按升序排序,则将最小排名赋值给NaN值
- bottom:如果按升序排序,则将最大排名赋值给NaN的值。
ascending:升序或降序排序,布尔值,指定多个排序可以使用布尔值列表
pct:布尔值,是否以百分比形式返回排名,默认值为False
顺序排名
import pandas as pd
excel_file = 'mrbook.xlsx'
df = pd.DataFrame(pd.read_excel(excel_file))
#按‘销量’列降序排序
df = df.sort_values(by = '销量',ascending= False)
#顺序排名
df['顺序排名'] = df['销量'].rank(method = 'first',ascending=False)
df1 = df[['图书名称','销量','顺序排名']]
print(df1)
平均排名
#平均排名
df['平均排名'] = df['销量'].rank(ascending=False)
df1 = df[['图书名称','销量','平均排名']]
print(df1)
最小值排名
#最小值排名:排名相同的,按顺序排名取最小值为排名
df['最小值排名'] = df['销量'].rank(method = 'min',ascending=False)
df1 = df[['图书名称','销量','最小值排名']]
print(df1)
最大值排名
#最大值排名:排名相同的,按顺序排名取最大值为排名
df['最大值排名'] = df['销量'].rank(method = 'max',ascending=False)
df1 = df[['图书名称','销量','最大值排名']]
print(df1)
notice:以上部分代码示例引用自《Python数据分析从入门到精通》 (2021年清华大学出版社出版的图书),如有侵权,请联系删除