【问题标题】:Filter Rows Based on Highest and Lowest Column Values根据最高和最低列值过滤行
【发布时间】:2022-01-19 08:04:03
【问题描述】:

我有一个独特的数据框:

df = pd.DataFrame({'student': 'A B C D'.split(),
                  'score1':[20, 15, 30, 22],
                   'score2': [15, 22, 35, 18],
                   'score3': [24, 32, 38, 25],
                   'score4': [20, 20, 26, 30]})

print(df)

  student  score1  score2  score3  score4
0       A      20      15      24      20
1       B      15      22      32      20
2       C      30      35      38      26
3       D      22      18      25      30

我只需要保留那些最高分数比最低分数增加超过 10 的行,否则将它们删除。

例如,对于学生A,最低分数是15,之后分数增加到24(增加9),所以我们要放弃它。

对于学生B,最低分数是15,分数提高到32,所以我们会保留它。

对于学生C,最低分数是26,但之后分数没有增加。它基本上是减少了,所以我们要放弃它。

我知道diff()ge() 在这里会有所帮助,但不确定当最低分(必须在最高分的左侧)和最高分(必须在右侧)时它们会如何工作最低分的一侧)相隔许多列。

期望的输出:

name

B #--highest score of 32 (score3) increased by 17 from lowest score of 15 (score1)  
D #--highest score of 30 (score4) increased by 12 from lowest score of 18 (score2) 

任何建议将不胜感激。谢谢!

【问题讨论】:

    标签: python pandas dataframe data-manipulation


    【解决方案1】:

    您可以首先使用sort_index 沿列对数据框进行排序,以便分数列的顺序正确(score1 -> score4)。然后,您可以使用idxmin(1) 获得每个学生的min(1) 分数和出现最小值的对应列(最大值相同):

    # Sort Index
    df.sort_index(axis=1,inplace=True) 
    sc = df.filter(like='score').columns
    
    # Max score with corresponding column
    ma = pd.concat([df[sc].idxmax(1),df[sc].max(1)],axis=1)
    mi = pd.concat([df[sc].idxmin(1),df[sc].min(1)],axis=1)
    

    最后,您可以使用布尔索引来比较 max 的第一列和 min 的第一列,这将显示 max 分数是否发生在 min 分数之后,并比较这些分数之间的差异是否大于 10:

    df.loc[(ma[0] > mi[0]) & (ma[1]-mi[1] > 10)]
    

    哪个会返回:

       score1  score2  score3  score4 student
    1      15      22      32      20       B
    3      22      18      25      30       D
    

    【讨论】:

    • 是的,我尝试了这个解决方案,它在更新的数据框上运行良好。赞成。
    【解决方案2】:

    试试:

    select_student = lambda x: x.sub(x.cummin()).gt(10).any()
    out = df[df.filter(like='score').apply(select_student, axis=1)]
    print(out)
    
    # Output:
      student  score1  score2  score3  score4
    1       B      15      22      32      20
    3       D      22      18      25      30
    

    【讨论】:

    • 在原始数据框中,如果score1 列表是这样的'score1':[20, 15, 27, 22],结果应该仍然相同,但您的解决方案也会返回学生C
    • @MuhammadHassan 我的回答应该是可靠的,对吧?
    猜你喜欢
    • 2019-01-02
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    相关资源
    最近更新 更多