pandas分组排序 如何获取第二大的数据

Python用来做数据分析很方便,网上很多关于找数据中第二大的方法,但是大多数都是关于SQL的,于是我挑战一下用Python来做这件事(主要是SQL写的不好>_<),上代码。

1、数据我是自己编的

在实际工作中应该从数据库中导入数据,如何从数据库导出数据,我之后会补充。

import pandas as pd
df = pd.DataFrame([
    {"class": 1, "name": "aa", "english": 120},
    {"class": 1, "name": "bb", "english": 110},
    {"class": 1, "name": "cc", "english": 110},
    {"class": 1, "name": "dd", "english": 110},
    {"class": 2, "name": "ee", "english": 120},
    {"class": 2, "name": "ff", "english": 140},
    {"class": 2, "name": "gg", "english": 130},
    {"class": 2, "name": "hh", "english": 130},
    {"class": 3, "name": "tt", "english": 130},
    {"class": 4, "name": "xx", "english": 130},
    {"class": 4, "name": "yy", "english": 130},
    {"class": 5, "name": "zz", "english": None},
  ])

2、分组取第二大的数据

def fun(df):
  # english数据去重
  sort_set = set(df["english"].values.tolist())
  if len(sort_set)<=1:
    # 数据量小于等于1,无法取到第二大的数据
    return None
  else:
    # 取english中第二大的值
    sort_value = sorted(sort_set,reverse=True)[1]
    temp_df = df[df["english"]==sort_value]
    return temp_df

df = df.groupby(by=["class"]).apply(fun).reset_index(drop=True)
print(df)

结果如下:

  class name english
0 1 bb 110.0
1 1 cc 110.0
2 1 dd 110.0
3 2 gg 130.0
4 2 hh 130.0

3、写完啦,就这么简单

当然这还可以改为取最大、取最小、取第三大、等等......

补充:pandas 按某一列A排序,按B和C两列分组,选择分组后A列值最大的行

pandas 按某一列A排序,按B和C两列分组,选择分组后A列值最大的行

一、需求

按 updateTime 列倒序排序,按 B 和 C 两列分组,分组后选择最后更新的时间的那一行,并将结果加上新索引。

二、代码

import pandas as pd
data = pd.read_csv('test.csv')
df = pd.DataFrame(data)
df = df.sort_values('updateTime', ascending=False).groupby(['B','C']).first().reset_index()

first() 函数代表选择第一行,如果要选取多行,可以使用 head() 函数: head(5)表示选择前五行。

如下例:

import pandas as pd
data = pd.read_csv('test.csv',header = 0)
df = pd.DataFrame(data)
# 按日期分组,分组后对 value 列从大到小排序,取每组前十行
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() 函数。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • Pandas中DataFrame的分组/分割/合并的实现

    学习<Python3爬虫.数据清洗与可视化实战>时自己的一些实践. DataFrame分组操作 注意分组后得到的就是Series对象了,而不再是DataFrame对象. import pandas as pd # 还是读取这份文件 df = pd.read_csv("E:/Data/practice/taobao_data.csv", delimiter=',', encoding='utf-8', header=0) # 计算'成交量'按'位置'分组的平均值 groupe

  • pandas 实现分组后取第N行

    目的: 把question_id 对应的user_answer转成ABCD solution dfa=df.groupby('question_id').nth(0).reset_index() dfa['flag']='A' dfb=df.groupby('question_id').nth(1).reset_index() dfb['flag']='B' dfc=df.groupby('question_id').nth(2).reset_index() dfc['flag']='C' df

  • pandas 实现某一列分组,其他列合并成list

    pandas列转换为字典,但将相同第一列(键)的所有值合并为一个键 形式一: import pandas as pd # data data = pd.DataFrame({'column1':['key1','key1','key2','key2'], 'column2':['value1','value2','value3','value3']}) print(data) # Grouped dict data_dict = data.groupby('column1').column2.a

  • pandas group分组与agg聚合的实例

    如下: import pandas as pd df = pd.DataFrame({'Country':['China','China', 'India', 'India', 'America', 'Japan', 'China', 'India'], 'Income':[10000, 10000, 5000, 5002, 40000, 50000, 8000, 5000], 'Age':[5000, 4321, 1234, 4010, 250, 250, 4500, 4321]}) 构造的数

  • pandas groupby分组对象的组内排序解决方案

    问题: 根据数据某列进行分组,选择其中另一列大小top-K的的所在行数据 解析: 求解思路很清晰,即先用groupby对数据进行分组,然后再根据分组后的某一列进行排序,选择排序结果后的top-K结果 案例: 取一下dataframe中B列各对象中C值最高所在的行 df = pd.DataFrame({"A": [2, 3, 5, 4], "B": ['a', 'b', 'b', 'a'], "C": [200801, 200902, 200704

  • pandas组内排序,并在每个分组内按序打上序号的操作

    问题: pandas组内排序,并在每个分组内按序打上序号 描述: pandas dataframe 对dep_id组内的salary排序.希望给下面原本只有前三列的dataframe,添加上第四列. 等价于sql里的排序函数 row_number() over() 功能 假设我已经建好了仅有前三列的dataframe,数据集命名为 MyData, 解决方案如下: MyData['sort_id'] = MyData['salary'].groupby(MyData['dep_id']).rank

  • pandas分组排序 如何获取第二大的数据

    Python用来做数据分析很方便,网上很多关于找数据中第二大的方法,但是大多数都是关于SQL的,于是我挑战一下用Python来做这件事(主要是SQL写的不好>_<),上代码. 1.数据我是自己编的 在实际工作中应该从数据库中导入数据,如何从数据库导出数据,我之后会补充. import pandas as pd df = pd.DataFrame([ {"class": 1, "name": "aa", "english&qu

  • oracle数据排序后获取前几行数据的写法(rownum、fetch方式)

    目录 0. 前言 1. 先说结论 2. 举个例子 1. 数据准备 2. 使用rownum方式获取前几行数据 3. 使用fetch方式获取前几行数据(推荐) 总结 0. 前言 无论在工作中,还是学习中,都会出现这样子的需求,对某张表进行了排序(按时间排序也好,其他字段排序也罢),然后获取前x行的数据,由于工作中经常出现,因此写篇文章记录一下多种写法. 1. 先说结论 第一种使用rownum方式,在oracle数据库中,查询出来的数据,可以通过rownum(行数)来指定具体第几行数据,但需要注意以下

  • pandas的排序、分组groupby及cumsum累计求和方式

    目录 生成一列sum_age 对age 进行累加 生成一列sum_age_new 按照 gender和is_good 对age进行累加 根据不同的性别对年龄进行 等级 排序 对数据排序之后,分组,并累计求和 pandas分组排序功能 生成一列sum_age 对age 进行累加 df['sum_age'] = df['age'].cumsum() print(df) 生成一列sum_age_new 按照 gender和is_good 对age进行累加 df['sum_age_new'] = df.

  • 利用PHP获取汉字首字母并且分组排序详解

    前言 本文主要给大家介绍了关于PHP获取汉字首字母并分组排序的相关内容,因经常我们在做项目的时候,会有按首字母排序的需求 比如: 美团的城市选择 http://www.meituan.com/index/changecity/initiative app中按字母搜索 正题 网上找了各种,不尽人意,于是,自己就写了一个,分享给大家. <?php /** * @author Tech */ class Character { /** * 二维数组根据首字母分组排序 * @param array $d

  • Pandas分组与排序的实现

    一.pandas分组 1.分组运算过程:split->apply->combine 拆分:进行分组的根据 应用:每个分组运行的计算规则 合并:把每个分组的计算结果合并起来 2.分组函数 DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, observed=False, **kwargs by: 依据哪些列进行分组,值可以是:mapping

  • Python 专题五 列表基础知识(二维list排序、获取下标和处理txt文本实例)

    通常测试人员或公司实习人员需要处理一些txt文本内容,而此时使用Python是比较方便的语言.它不光在爬取网上资料上方便,还在NLP自然语言处理方面拥有独到的优势.这篇文章主要简单的介绍使用Python处理txt汉字文字.二维列表排序和获取list下标.希望文章对你有所帮助或提供一些见解~ 一. list二维数组排序 功能:已经通过Python从维基百科中获取了国家的国土面积和排名信息,此时需要获取国土面积并进行排序判断世界排名是否正确. 列表基础知识 列表类型同字符串一样也是序列式的数据类型,

  • pandas的排序和排名的具体使用

    有的时候我们可以要根据索引的大小或者值的大小对Series和DataFrame进行排名和排序. 一.排序 pandas提供了sort_index方法可以根据行或列的索引按照字典的顺序进行排序 a.Series排序 1.按索引进行排序 #定义一个Series s = Series([1,2,3],index=["a","c","b"]) #对Series的索引进行排序,默认是升序 print(s.sort_index()) ''' a 1 b 3

  • mysql如何通过当前排序字段获取相邻数据项

    目录 通过当前排序字段获取相邻数据项 1.业务场景 2.思路 3.sql 同表相邻数据查询或计算 用户下相邻订单的时间差举例 通过当前排序字段获取相邻数据项 1.业务场景 (1)需要专门以一个弹窗页面展示一项数据的所有字段值.其中一些字段值长度较大. (2)能够左右切换上一项下一项数据 (3)存在可排序的字段,如以id进行排序 2.思路 2.1 sql 1>查询前一项,查询小于当前id的项逆序取第一个 2>查询后一项,查询大于当前id的项正序取第一个 3>连接两项结果 2.2 页面逻辑

  • Winform中GridView分组排序功能实现方法

    本文实例讲述了Winform中GridView分组排序功能实现方法.分享给大家供大家参考.具体实现方法如下: 一.问题: 由于客户最近要扩充公司的业务,之前基于Winform+web开发混合式的系统已经不能满足他们的需求,需要从新对系统进行分区处理. 考虑到系统模块里面用到的GridView视图比较多,我就结合了DevExpress第三方GridControl简单的写了个Demo,对数据进行分组排序. 二.实现方法: 主程序源码: 复制代码 代码如下: using System; using S

  • pandas数据清洗,排序,索引设置,数据选取方法

    此教程适合有pandas基础的童鞋来看,很多知识点会一笔带过,不做详细解释 Pandas数据格式 Series DataFrame:每个column就是一个Series 基础属性shape,index,columns,values,dtypes,describe(),head(),tail() 统计属性Series: count(),value_counts(),前者是统计总数,后者统计各自value的总数 df.isnull() df的空值为True df.notnull() df的非空值为T

随机推荐