pandas统计分析(上)

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时还需要安装xlrdxlwt库来解决依赖关系。

导入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)

结果:


图片.png

手动设置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)
图片.png

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']])
图片.png

Series切片索引

用标签索引做切片,包含索引开始的位置,也包含索引结束的位置。

用位置索引做切片,包含索引开始的位置,不包含索引结束的位置。

s2 = pd.Series([88,60,75],index=['a','b','c'])
print(s2['a':'c'])
图片.png
s2 = pd.Series([88,60,75],index=['a','b','c'])
print(s2[0:2])
图片.png

获取Series索引和值

获取Series索引和值主要使用Series的index和values方法。

s2 = pd.Series([88,60,75])
print(s2.index)
print(s2.values)
图片.png

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)
图片.png

创建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
图片.png

字典创建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
图片.png

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文件:

图片.png

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
图片.png

使用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]])#抽取第一列和第二列
图片.png
图片.png

按指定条件抽取数据

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
图片.png

数据的增删改查

增加

  • 直接为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]))
图片.png

如果不想用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()
图片.png
#按多列排序
df1 = df.sort_values(by  =['图书名称','销量'])
df1.head()
图片.png
#对统计结果排序
df1 = df.groupby(['类别'])['销量'].sum().reset_index()
df2 = df1.sort_values(by = '销量',ascending=False)
df2.head()
图片.png
#按行数据 排序
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)
图片.png

平均排名

#平均排名
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年清华大学出版社出版的图书),如有侵权,请联系删除

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,710评论 4 376
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,839评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,295评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,776评论 0 223
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,198评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,074评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,200评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,986评论 0 214
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,733评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,877评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,348评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,675评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,393评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,209评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,212评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,003评论 2 280

推荐阅读更多精彩内容