首页 > 解决方案 > 如何在熊猫数据框的每一行中找到选定列中的两个最低值?

问题描述

在计算成绩时,我会去掉每个学生的两个最低作业分数。此处显示了示例数据框:

df=pd.DataFrame([[10, 9, 10, 5, 7], [8, 7, 9, 9, 4], [10, 10, 7, 0, 8],
                [5, 9, 7, 6, 3], [10, 5, 0, 8, 10], [8, 9, 10, 10, 10]],
               columns=['HW1', 'HW2', 'HW3', 'HW4', 'HW5'],
               index=['Aaron', 'Bridget', 'Charles', 'Donna', 'Evan', 'Francesca'])

df

实际的数据框包含比这更多的列(用于测试、报告等),但这是家庭作业,我需要找到每条记录的两个最低分数。

我想在数据框中添加两列,['Lowest'] 和 ['Second_Lowest'],并分别在这些列中指示每个学生的最低分数和第二低分数。

我使用 .min() 方法尝试了以下代码以获取最小值,但出现错误:

df['Lowest_HW'] = df[['HW1', 'HW2', 'HW3', 'HW4', 'HW5']].min()

df.head()

在此处输入图像描述

所以对于 Aaron,Lowest 的值为 5,Second_Lowest 的值为 7;对于 Francesca,Lowest 为 8,Second_Lowest 为 9。

显然, .min() 方法的代码不正确,我对找到第二低的值完全一无所知。

关于如何处理这些步骤的任何建议?

标签: pythonpandasminimumdata-wrangling

解决方案


您可以使用np.sort并仅选择前 2 列来同时创建最低的两列:

df['lowest'], df['second_lowest'] = np.sort(df, axis=1)[:, :2].T
print (df)
           HW1  HW2  HW3  HW4  HW5  lowest  second_lowest
Aaron       10    9   10    5    7       5              7
Bridget      8    7    9    9    4       4              7
Charles     10   10    7    0    8       0              7
Donna        5    9    7    6    3       3              5
Evan        10    5    0    8   10       0              5
Francesca    8    9   10   10   10       8              9

但是如果你的意思是在没有这两个最低值的情况下得到总和,那么不要创建上述列并执行

df['sum_without_2lowest'] = np.sort(df, axis=1)[:, 2:].sum(1)
print (df)
           HW1  HW2  HW3  HW4  HW5  sum_without_2lowest
Aaron       10    9   10    5    7                   29
Bridget      8    7    9    9    4                   26
Charles     10   10    7    0    8                   28
Donna        5    9    7    6    3                   22
Evan        10    5    0    8   10                   28
Francesca    8    9   10   10   10                   30

推荐阅读