• 售前

  • 售后

热门帖子
入门百科

pandas分组排序 怎样获取第二大的数据

[复制链接]
123457886 显示全部楼层 发表于 2021-10-26 13:47:52 |阅读模式 打印 上一主题 下一主题
Python用来做数据分析很方便,网上很多关于找数据中第二大的方法,但是大多数都是关于SQL的,于是我挑战一下用Python来做这件事(主要是SQL写的不好>_<),上代码。
1、数据我是自己编的

在现实工作中应该从数据库中导入数据,如何从数据库导出数据,我之后会增补。
  1. import pandas as pd
  2. df = pd.DataFrame([
  3.     {"class": 1, "name": "aa", "english": 120},
  4.     {"class": 1, "name": "bb", "english": 110},
  5.     {"class": 1, "name": "cc", "english": 110},
  6.     {"class": 1, "name": "dd", "english": 110},
  7.     {"class": 2, "name": "ee", "english": 120},
  8.     {"class": 2, "name": "ff", "english": 140},
  9.     {"class": 2, "name": "gg", "english": 130},
  10.     {"class": 2, "name": "hh", "english": 130},
  11.     {"class": 3, "name": "tt", "english": 130},
  12.     {"class": 4, "name": "xx", "english": 130},
  13.     {"class": 4, "name": "yy", "english": 130},
  14.     {"class": 5, "name": "zz", "english": None},
  15.   ])
复制代码
2、分组取第二大的数据
  1. def fun(df):
  2.   # english数据去重
  3.   sort_set = set(df["english"].values.tolist())
  4.   if len(sort_set)<=1:
  5.     # 数据量小于等于1,无法取到第二大的数据
  6.     return None
  7.   else:
  8.     # 取english中第二大的值
  9.     sort_value = sorted(sort_set,reverse=True)[1]
  10.     temp_df = df[df["english"]==sort_value]
  11.     return temp_df
  12. df = df.groupby(by=["class"]).apply(fun).reset_index(drop=True)
  13. print(df)
复制代码
结果如下:
  1.   class name english
  2. 0 1 bb 110.0
  3. 1 1 cc 110.0
  4. 2 1 dd 110.0
  5. 3 2 gg 130.0
  6. 4 2 hh 130.0
复制代码
3、写完啦,就这么简单

固然这还可以改为取最大、取最小、取第三大、等等......
增补:pandas 按某一列A排序,按B和C两列分组,选择分组后A列值最大的行
pandas 按某一列A排序,按B和C两列分组,选择分组后A列值最大的行
一、需求

按 updateTime 列倒序排序,按 B 和 C 两列分组,分组后选择末了更新的时间的那一行,并将结果加上新索引。
二、代码
  1. import pandas as pd
  2. data = pd.read_csv('test.csv')
  3. df = pd.DataFrame(data)
  4. df = df.sort_values('updateTime', ascending=False).groupby(['B','C']).first().reset_index()
复制代码
first() 函数代表选择第一行,假如要选取多行,可以使用 head() 函数: head(5)表示选择前五行。
如下例:
  1. import pandas as pd
  2. data = pd.read_csv('test.csv',header = 0)
  3. df = pd.DataFrame(data)
  4. # 按日期分组,分组后对 value 列从大到小排序,取每组前十行
  5. df = df.groupby('date', group_keys=False).apply(lambda x: x.sort_values('value', ascending=False)).groupby('date').head(10).reset_index()
复制代码
在不能直接使用sort_values() 函数时,使用 apply() 函数。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持草根技术分享。如有错误或未考虑完全的地方,望不吝赐教。

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作