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

339 阅读1分钟

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、写完啦,就这么简单,当然这还可以改为取最大、取最小、取第三大、等等......

有需要的小伙伴可以自行更改,或者评论留言我来帮你改,喜欢的话给个关注呗!

更多好玩的内容,欢迎关注微信公众号“数据与编程之美”