数据排序和排名
数据排序
DataFrame排序时主要使用sort_values()方法
-
df.sort_values(by,axis=0,ascending=True,inplace=False,kind=’quicksort’,na_position=’last’,ignore_index=False)
参数说明:
-
by: 要排序的名称列表
-
axis:轴,0表示行,1表示列,默认行排序
-
ascending:升序或降序排序,布尔值,指定多个排序可以使用布尔值列表,降序
-
inplace:布尔值,默认值为False,如果值为True,则就地排序
-
kind:指定排序算法,值为’quicksort’(快速排序)、’mergesort’(混合排序)或’heapsort’(堆排),默认值为quicksort
-
na_position:空值(NaN)的位置,值为first空值在数据开头,last空值在最后,默认值为last
-
ignore_index:布尔值,是否忽略索引,值为True标记索引(从0开始按顺序的整数值),值为False则忽略索引。
import pandas as pd
df=pd.read_excel('电脑配件销售记录.xlsx')
pd.set_option('display.unicode.east_asian_width',True)
print(df.head())
# 排序
df=df.sort_values(by='成交金额',ascending=False) # 降序排序 ,ascending
print(df.head())
'''
产品名称 销售员 数量 标准单价 成交金额
6 鼠标 李桂林 77 299 23023
21 键盘 王丽 120 180 21600
5 鼠标 王双 52 299 15548
28 DVD光驱 华国华 48 240 11520
19 蓝牙适配器 李欢 95 108 10260
'''
#根据多列进行排序,数量和成交金额,数量相同的情况下,成交金额降序
df=df.sort_values(by=['数量','成交金额'],ascending=False)
#根据多列进行排序,数量和成交金额,数量升序,成交金额降序
# df=df.sort_values(by=['数量','成交金额'],ascending=[True,False])
print(df)
'''
14 DVD光驱 王丽 32 240 7680
26 DVD光驱 王丽 30 240 7200
24 无线网卡 李桂林 30 178 5340
9 SD存储卡 李桂林 20 290 5800
5 键盘 华国华 20 180 3600
'''
数据排名
排名是根据Series或DataFrame对象的某几列的值进行排名,主要使用rank方法
-
df.rank(axis=0,method=’average’,ascending=True,na_option=’keep’)
参数说明:
-
axis:轴,0表示行,1表示列,默认按行排序
-
method:表示在具有相同值的情况下所使用的排序方法
-
average:默认值,平均排序
-
min:最小值排名
-
max:最大值排名
-
first:按值在原始数据中的出现的顺序分配排名
-
dense:密集排名,类似最小值排名,排名相同的数据只占一个名次
-
-
na_option:空值的排序方式
-
keep:保留
-
top:如果升序,将最小排名赋给NaN
-
bottom;最果升序,将最大排名赋给NaN
-
import pandas as pd
df=pd.read_excel('电脑配件销售记录.xlsx')
pd.set_option('display.unicode.east_asian_width',True)
df=df.sort_values(by='数量',ascending=False)
#print(df)
df['顺序排名']=df['数量'].rank(ascending=False) # 默认采用了顺序排名的平均值
print(df)
'''
26 DVD光驱 王丽 32 240 7680 15.0
25 DVD光驱 王丽 30 240 7200 16.5
1 无线网卡 李桂林 30 178 5340 16.5
24 SD存储卡 李桂林 20 290 5800 18.5
20 键盘 华国华 20 180 3600 18.5
14 蓝牙适配器 李桂林 18 108 1944 20.0
'''
df['顺序排名']=df['数量'].rank(method='min',ascending=False) # 采用最小值排序
print(df)
'''
14 DVD光驱 王丽 32 240 7680 15.0
26 DVD光驱 王丽 30 240 7200 16.0
24 无线网卡 李桂林 30 178 5340 16.0
9 SD存储卡 李桂林 20 290 5800 18.0
5 键盘 华国华 20 180 3600 18.0
3 蓝牙适配器 李桂林 18 108 1944 20.0
'''
数据计算
功能 | 函数 | 描述 |
---|---|---|
求和 | sum([axis,skipna]) | axis=1表示按行加,axis=0表示按列加,默认列加 skipna=1表示将NaN转0,skipna=0表示不转 |
求均值 | mean([axis,skipna]) | |
最大值 | max([axis,skipna]) | |
最小值 | min([axis,skipna]) | |
中位数 | median(axis=None,skipna=None) | axis=1表示行,axis=0表示列,默认为None skipna布尔值,表示计算结果是否排除了NaN/Null,默认为True |
求众数 | mode(axis=0,dropna=True) | axis=1表示行,axis=0表示列,默认值为0 dropna是否删除缺失值,布尔型,默认为True |
求方差 | var(axis=None,skipna=None) | |
标准差 | std(axis=None,skipna=None) | |
分位数 | quantile(q=0.5,axis=0,numeric_only=True) | numeric_only的值为False将计算日期、时间和时间增量数据的分位数 |
import pandas as pd
pd.set_option('display.unicode.east_asian_width',True)
data=[[100,90,80],[98,67,56],[56,56,45]]
columns=['数学','语文','英语']
df=pd.DataFrame(data=data,columns=columns,index=[1,2,3])
print(df)
#求和
df['总成绩']=df.sum(axis=1) # 按行相加
print(df)
'''
数学 语文 英语 总成绩
1 100 90 80 270
2 98 67 56 221
3 56 56 45 157
'''
# 计算平均值
df=df.append(df.mean(),ignore_index=True) #默认按照列计算平均值,若存在NaN则会跳过
print(df)
'''
数学 语文 英语
0 100.000000 90.0 80.000000
1 98.000000 67.0 56.000000
2 56.000000 56.0 45.000000
3 84.666667 71.0 60.333333
'''
# 最大值
df=df.append(df.max(),ignore_index=True) #最大值
print(df)
'''
数学 语文 英语
0 100.0 90.0 80.0
1 98.0 67.0 56.0
2 56.0 56.0 NaN
3 100.0 90.0 80.0
'''
# 最小值
df=df.append(df.min(),ignore_index=True) #最小值
print(df)
'''
数学 语文 英语
0 100.0 90.0 80.0
1 98.0 67.0 56.0
2 56.0 56.0 NaN
3 56.0 56.0 56.0
'''
# 中位数 (数组中间的数,若有两个,则返回两个数的平均数)
df=df.append(df.median(),ignore_index=True) #中位数
print(df)
'''
数学 语文 英语
0 100.0 90.0 80.0
1 98.0 67.0 56.0
2 56.0 56.0 NaN
3 98.0 67.0 68.0
'''
# 求众数
import pandas as pd
pd.set_option('display.unicode.east_asian_width',True)
data=[[100,90,100],[100,76,76],[76,90,76]]
columns=['数学','语文','英语']
df=pd.DataFrame(data=data,columns=columns,index=[1,2,3])
print(df)
'''
数学 语文 英语
1 100 90 100
2 100 76 76
3 76 90 76
'''
#三科成绩的众数
print(df.mode())
'''
数学 语文 英语
0 100 90 76
'''
# 行中的众数
print(df.mode(axis=1))
'''
0
1 100
2 76
3 76
'''
#数学的众数
print(df['数学'].mode())
'''
0 100
dtype: int64
'''
# 求方差
import pandas as pd
data=[[135,140,138,145,140],[140,145,139,142,132]]
index=['李凡','郭曙光']
columns=['一模','二模','三模','四模','五模']
df=pd.DataFrame(data=data,index=index,columns=columns)
print(df)
'''
一模 二模 三模 四模 五模
李凡 135 140 138 145 140
郭曙光 140 145 139 142 132
'''
print(df.var(axis=1)) # Pandas采用的是无偏样式方差 方差和/样本数-1
'''
李凡 13.3
郭曙光 23.3
dtype: float64
'''
# 求标准差
import pandas as pd
pd.set_option('display.unicode.east_asian_width',True)
data=[[100,90,100],[100,76,76],[76,90,76]]
columns=['数学','语文','英语']
df=pd.DataFrame(data=data,columns=columns,index=[1,2,3])
print(df)
'''
数学 语文 英语
1 100 90 100
2 100 76 76
3 76 90 76
'''
print(df.std())
'''
数学 13.856406
语文 8.082904
英语 13.856406
dtype: float64
'''
# 求分位数
import pandas as pd
data=[120,110,112,100,98,34,123,115]
columns=['数学']
df=pd.DataFrame(data=data,columns=columns)
print(df)
# 计算35%
x=df['数学'].quantile(0.35)
print(x) # 104.5
print(df[df['数学']<x])
'''
数学
3 100
4 98
5 34
'''
# 分位数, numeric_only=False
import pandas as pd
df=pd.DataFrame(
{
'A':[1,2],
'B':[pd.Timestamp('2020'),pd.Timestamp('2021')],
'C':[pd.Timedelta('1 days'),pd.Timedelta('2 days')]
})
print(df.quantile(0.5,numeric_only=False))
'''
A 1.5
B 2020-07-02 00:00:00
C 1 days 12:00:00
Name: 0.5, dtype: object
'''
数据格式化
对数据进行格式化,以增加数据的可读性
常用的方式
-
设置小数位数
-
df.round(decimals=0)
-
-
设置百分比
-
apply()函数与format()函数
-
-
设置千位分隔符
-
apply()函数与format()函数
-
# 设置小数位置
import pandas as pd
df=pd.read_excel('格式化数据.xlsx')
print(df)
# 方式一 直接使用round
print(df.round(2)) # 对df的所有元素起作用 round中的参数是一个整数
print('-------------------------------')
# 方式二 对指定列保留小数位置
print(df.round({'A1':1,'A2':2})) # round中的参数是一个字典
print('-------------------------------')
# 方式三 用series对象进行指定保留
s1=pd.Series([1,0,2,1,2],index=['A1','A2','A3','A4','A5'])
print(s1)
print('-------------------------------') #round中的参数是一个Series对象
df2=df.round(s1)
print(df2)
print('-------------------------------')
# 方式四 使用自定义函数实现保留小数位置
df3=df.applymap(lambda x :'{:.2f}'.format(x))
print(df3)
#设置百分比
import pandas as pd
df=pd.read_excel('格式化数据.xlsx')
print(df)
print('-----------------------------')
df['百分比']=df['A1'].apply(lambda x:format(x,'.0%')) # 对A1列进行设置百分比
print(df)
'''
A1 A2 A3 A4 A5 百分比
0 0.527350 0.410396 0.131101 0.565818 0.322695 53%
1 0.007817 0.663029 0.480029 0.551382 0.603932 1%
2 0.123241 0.935813 0.052935 0.207342 0.183324 12%
3 0.405295 0.623856 0.254653 0.368602 0.751753 41%
4 0.195120 0.623856 0.477747 0.592885 0.751753 20%
'''
print('-----------------------------')
df['百分比']=df['A1'].apply(lambda x:format(x,'.2%')) #
print(df)
print('-----------------------------')
# map()函数
df['百分比']=df['A1'].map(lambda x:format(x,'.2%')) #
print(df)
# 设置千位分隔符
import pandas as pd
pd.set_option('display.unicode.east_asian_width',True)
df=pd.read_excel('msb课程记录.xls')
print(df)
print(df.info())
print('------------------------------')
df['买家实际支付金额']=df['买家实际支付金额'].apply(lambda x:format(int(x),','))
print(df)
print(df.info())
'''
买家会员名 买家实际支付金额 课程总数量 课程标题 类别 \
0 msb001 30,960 2.0 Java互联网高级架构师 课程
1 msb002 1 1.0 金三银四面试突击班 NaN
2 msb003 9,980 1.0 GoLang从入门到精通 课程
'''
apply()、map()、applymap()的区别
# apply(),map(),applymap()区别
#apply()可以在Series,对Series的每一个元素都执行一次函数,也可以在DataFrame中起作用,对DataFrame中的某一行或某一列的每个元素扫许一次函数
import pandas as pd
s=pd.Series(data=[10,20,30,40],index=['a','b','c','d'])
print(s)
print('-------------------------------------')
s=s.apply(lambda x:x+10)
print(s)
print('----------------------------------')
df=pd.DataFrame(data=[[10,20,30,40],[11,22,33,44]],index=['a','b'],columns=['A','B','C','D'])
print(df)
print('----------------------------------')
df2=df.apply(lambda x:x.sum(),axis=0) # 0表示行,1表示列,默认是行运算
print(df2)
print('----------------------------------')
df2=df.apply(lambda x:x.sum(),axis=1) # 0表示行,1表示列,默认是行运算
print(df2)
# map只能应用在Series的每个元素上
df=pd.DataFrame(data=[['男'],['女'],['男'],['男']],index=['张三','李四','王五','陈六'],columns=['性别'])
print(df)
def gender(g):
if g=='男':
return 0
else:
return 1
print('----------------------------------')
# map的参数是一个函数
#print(type(df['性别'])) df['性别']是一个Series对象
df2=df['性别'].map(gender) # 参数是一个函数
print(df2)
print('----------------------------------')
# map()的参数还可以是一个字典
df3=df['性别'].map({'男':0,'女':1})
print(df3)
# applymap()将函数应用到DataFrame中的每一个元素中 ,与apply()的区别,apply()只能应用到某列或某行
df=pd.DataFrame(data=[[10,20,30,40],[11,22,33,44]],index=['a','b'],columns=['A','B','C','D'])
print(df)
df=df.applymap(lambda x:x+10)
print(df)