测试数据如下:
import numpy as np
data = {'animal': ['cat', 'cat', 'snake', 'dog', 'dog', 'cat', 'snake', 'cat', 'dog', 'dog'],
'age': [2.5, 3, 0.5, np.nan, 5, 2, 4.5, np.nan, 7, 3],
'visits': [1, 3, 2, 3, 2, 3, 1, 1, 2, 1],
'priority': ['yes', 'yes', 'no', 'yes', 'no', 'no', 'no', 'yes', 'no', 'no']}
labels = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
df = pd.DataFrame(data, index=labels)
排序
sort_values()
df.sort_values(by, axis=0, ascending=True, inplace=False, kind=‘quicksort’, na_position=‘last’)
by:排序列
ascending:True升序,False降序,默认升序
na_position:默认值为last,表示将缺失值显示在最后
(1)按单列数值排序
#按照年龄升序
df.sort_values(by=["age"],ascending=True)
(2)有缺失值的列排序
#按照年龄升序,缺失值在最前面
df.sort_values(by=["age"],ascending=True,na_position="first")
(3)按多列数据排序
#按照年龄降序,游客数升序排列
df.sort_values(by=["age","visits"],ascending=[False,True])
替换
replace()
df.replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method=‘pad’, axis=None)
(1)一对一替换
#将animal列中的cat换为duck
df["animal"]=df["animal"].replace("cat",“duck”)
(2)多对一替换
#将priority列中的yes和no换为True
df["priority"]=df["priority"].replace(["yes","no"],True)
(3)多对一替换
#将priority列中的yes和no换为True和False
df["priority"]=df["priority"].replace({"yes":True,"no":False})
(4)缺失值替换
#将年龄的缺失值替换为0
df["age"]=df["age"].replace(np.nan,0)
分组
groupby()
df.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, **kwargs)
查看某列的统计结果,一定要将列名置于groupby后面
(1)使用列名作为分组键
#单列分组,计算各类动物的数量
df.groupby('animal').count()
#多列分组,计算各类动物是否具有优先权的数量
df.groupby(['animal','priority']).count()
(2)使用Series作为分组键
#单列分组,计算各类动物的平均年龄
df.groupby(df['animal'])["age"].mean()
#多列分组(定要使用[]将多列括起来),计算各类动物、是否具备优先权的平均年龄
df.groupby([ df['animal'], df['priority'] ])["age"].mean()
(3)使用aggregate方法查看多种统计值(使用列名作为分组键)
①查看单列多种统计值
#计算各类动物的平均年龄、最大年龄
df.groupby( 'animal' )[‘age’].aggregate( [ 'mean', 'max' ] )
②查看不同列的不同统计值
#按照动物种类、是否具备优先权分组,计算各组的平均年龄以及是否具备优先权的个数
df.groupby(['animal','priority'])['age'].aggregate( { 'animal':'mean','priority':'count' })
(4)重置索引
df.groupby('animal')['age'].aggregate(['mean','count']).reset_index()
数据透视表
pivot_table()
df.pivot_table(values=None, index=None, columns=None, aggfunc=‘mean’, fill_value=None, margins=False, dropna=True, margins_name=‘All’)
values 值,统计运算对象
index 行
columns 列
aggfunc 计算方式
fill_value 对空值的填充
margins 是否显示合计列
dropna 表示是否删除缺失,True表示把一整行全作为缺失值删除
margins_name 表示合计列的列名
df.pivot_table(index="animal",columns="visits",values="age",aggfunc="mean",margins=True)
#表达方式2
#pd.pivot_table(df,index="animal",columns="visits",values="age",aggfunc="mean")
排名
rank()
df.rank(axis=0, method=‘average’, numeric_only=None, na_option=‘keep’, ascending=True, pct=False)
ascending 默认为升序排列,True升序排列False降序排列
method 待排列值有重复值时的处理情况
①average:当待排名的数值有重复值时返回重复值的平均排名;
②first:按重复值出现的先后顺序排名,为连续值;
③min:当待排名的数值有重复值时返回重复值的最小排名;
④max:当待排名的数值有重复值时返回重复值的最大排名
(1)单列排名
df=df.sort_values(by=["age"],ascending=1,na_position='last')
df["rank"]=df["age"].rank(ascending=1,method="min",na_option='keep')
(2)组内排名
df=df.sort_values(by=["animal","age"],ascending=[1,1],na_position='last')
df["rank"]=df["age"].groupby(df["animal"]).rank(ascending=1,method="min",na_option='keep')
其他
(1)计数
value_counts()
#统计次数
df["animal"].value_counts()
#统计频率
df["animal"].value_counts(normalize=True)
(2)唯一值
查看所有唯一值unique()
统计唯一值的数量nunique()
df["animal"].unique()