(六)Pandas数据排名、计算、格式化

数据排序和排名

数据排序

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)

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值