如何从Python DataFrame列中获取前N个不同最大值的所有行?
获取DataFrame中duration列前3个不同最大值的所有行
问题背景
需求:从Python DataFrame的duration列中获取前3个不同最大值的所有重复行。
现有代码
# to get 3 largest numbers from column duration with all duplicates import pandas as pd technologies = "A B C D E F G H I J".split() duration = [88,70,50,87,77,88,77,88,1,87] columns = ['technologies','duration'] df = pd.DataFrame(list(zip(technologies,duration)), columns=columns) print(df.nlargest(3, 'duration',keep = "all"))
当前输出
technologies duration 0 A 88 5 F 88 7 H 88
期望输出
technologies duration 0 A 88 5 F 88 7 H 88 3 D 87 9 J 87 4 E 77 6 G 77
原代码的问题在于:nlargest(3, 'duration', keep="all")是按行取前3个最大记录,但所有最大值为88的行已超过3条,因此只会返回所有88的行,无法覆盖第二、第三大的不同值。
解决方案
要实现需求,需先提取前3个不同的最大值,再筛选出所有duration属于该集合的行。
修改后的代码
import pandas as pd technologies = "A B C D E F G H I J".split() duration = [88,70,50,87,77,88,77,88,1,87] columns = ['technologies','duration'] df = pd.DataFrame(list(zip(technologies,duration)), columns=columns) # 提取降序排列的前3个不同duration值 top_3_unique_values = df['duration'].drop_duplicates().sort_values(ascending=False)[:3].tolist() # 筛选符合条件的行,并按duration降序排列 result = df[df['duration'].isin(top_3_unique_values)].sort_values('duration', ascending=False) print(result)
代码解释
df['duration'].drop_duplicates():获取去重后的duration值,确保每个值仅出现一次。sort_values(ascending=False)[:3]:将去重后的数值降序排列,取前3个即为最大的三个不同值。df['duration'].isin(top_3_unique_values):筛选出所有duration属于这三个值的行。sort_values('duration', ascending=False):按duration降序排列,让结果与期望输出格式一致。
另一种简洁写法
也可以用unique()结合排序实现:
top_3_unique_values = sorted(df['duration'].unique(), reverse=True)[:3] result = df[df['duration'].isin(top_3_unique_values)].sort_values('duration', ascending=False) print(result)
内容的提问来源于stack exchange,提问作者user20773638
相关产品推荐
相关产品推荐

