python中分组排序--groupby(),rank()

1.python 中分组统计

1.1按性别统计出年龄最大,最小,平均值

 
  1. import pandas as pd

  2. df = pd.read_excel(r'./data.xlsx')

  3. print(df)

  4. ages = df.groupby(['gender'])['age']

  5. ages_min = ages.min()

  6. ages_max = ages.max()

  7. ages_mean = ages.mean()

  8. print(ages_min)

  9. print(ages_max)

  10. print(ages_mean)

  11.  
  12. '''

  13. 输出结果

  14. gender

  15. 女 16

  16. 男 12

  17. Name: age, dtype: int64

  18. gender

  19. 女 32

  20. 男 32

  21. Name: age, dtype: int64

  22. gender

  23. 女 25.25

  24. 男 17.20

  25. Name: age, dtype: float64

  26. '''

1.2生成一列sum_age 对age 进行累加

 
  1. df['sum_age'] = df['age'].cumsum()

  2. print(df)

1.3新生成一列sum_age_new 按照gender和is_good对age进行累加

 

 
  1. df['sum_age_new'] = df.groupby(['gender','is_good'])['age'].cumsum()

  2. print(df)

2.python中排序问题

2.1 按照年龄进行排序

 
  1. df['rank'] = df['age'].rank()

  2. df['rank_mean'] = df['age'].rank(method='average')

  3. df['rank_min'] = df['age'].rank(method='min')

  4. df['rank_max'] = df['age'].rank(method='max')

  5. df['rank_first'] = df['age'].rank(method='first')

  6. print(df)

根据不同的性别对年龄进行排序

 
  1. df['rank_g'] = df.groupby(['gender'])['age'].rank()

  2. print(df)

2.2在排序的过程中遇到两个数值相同,空置的排序情况,在这种条件下rank如何进行参数设置

首先排序过程中存在相同的数值时?

rank()函数参数设置

1.method  : {‘average’, ‘min’, ‘max’, ‘first’, ‘dense’}, default ‘average’ 主要用来当排序时存在相同值参数设置;

默认为average平均值:年龄为32的数值,排序应该为8,9取平均值则为8.5

min:排序中最小值,年龄排序中取值为8

max:排序中最大值,年龄排序中取值9

first:同样数值按照值出现的前后进行排序 5号性别为男的年龄排序为8,7号性别为女的排序为9

dense: like ‘min’, but rank always increases by 1 between groups 排序时当值相同时,相同的值为同一排名类似min值排序,后续值排名在此排名基础上加一

2.na_option : {‘keep’, ‘top’, ‘bottom’}, default ‘keep’  当排序数据中存在空值时,默认值设置为keep

How to rank NaN values:

  • keep: assign NaN rank to NaN values    默认空值不参与排序
  • top: assign smallest rank to NaN values if ascending    默认为升序时从空值为最小值排序
  • bottom: assign highest rank to NaN values if ascending 默认升序时 空置为
     
    1. df['rank'] = df['age'].rank(method='first')

    2. df['rank_k'] = df['age'].rank(method='first',na_option='keep')

    3. df['rank_t'] = df['age'].rank(method='first',na_option='top')

    4. df['rank_b'] = df['age'].rank(method='first',na_option='bottom')

    5. print(df)

 
  1. data['rank'] = data.groupby(['Name_y'])['Salary'].rank(ascending=False,method='dense')

  2. print(data)

3.对salary进行降序排序,对于排序中相同salary值按照emp_no的大小进行排序

在使用pandas时先按照emp_no和salary进行值的排序,然后再进行rank(method=‘dense’)排序

 
  1. df = pd.DataFrame({'emp_no':[10001,10002,10003,10004,10005,10006,10007,10010,10009,10011],'salary':[88958,72527,43311,74057,94692,43311,88070,94409,94409,25828]})

  2. print(df)

  3. df['排序-1'] = df.sort_values(by=['emp_no','salary'])['salary'].rank(method='first',ascending=False)

  4. dt = df.sort_values(by=['排序-1'])

  5. print(dt)

 
  1. df['排序-1'] = df['salary'].rank(method='dense',ascending=False)

  2. dt = df.sort_values(by=['排序-1','emp_no'])

  3. print(dt)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值