return 每列或每行表现最差的 df

return df with lowest performers per col or row

我正在尝试生成一个 df,每个单元的元素得分最低。简化版本如下所示:

data = pd.DataFrame({'Unit':[''A', 'B', C'], 'leader':['John', 'Jane', 'Joe'],element 1':[1.0, 0.97, 0.65], 'element 2':[0.55, 0.67, 1.0], 'element 3':[0.32, 0.87, 0.66 }, index=['Unit')

这导致:

       leader  element 1 element 2 element 3
A        John       1.0       0.55     0.32
B        Jane      0.97       0.67     0.87
C         Joe      0.65        1.0     0.66

我正在尝试 return 按分数和每个单元的元素拼贴排名前两个表现最差的元素。输出应如下所示:

       leader Worst performing element Worst performing score Second worst element Second worse score
Unit 1   John                element 3                  0.32             element 2               0.55
Unit 2   Jane                element 2                  0.67             element 3               0.87
Unit 3    Joe                element 1                  0.65             element 3               0.67

我试过 pivot_table 然后按行循环查找 .min() 值(例如 1),但我无法得到第二个更差的值。 .nsmallest 也不按行合作。

ex1:

scorecard = pd.DataFrame()
elements = ['element 1', 'element 2', 'element 3']

for row in data:
    scorecard['Unit'] = data['Unit']
    scorecard['leader'] = data['leader']
    scorecard['Lowest Element Compliance'] = april[elements].min(axis=1)
    scorecard['Lowest Performing Element'] = april[elements].idxmin(axis=1)
    unit_sorted = april[elements]

scorecard

非常感谢任何帮助!!

克里斯

您快完成了,但是您遗漏了 pandas 中的一些重要概念。

Keep in mind that looping over a pandas.DataFrame() directly will iterate over the dataframe's columns. For example, for col in pandas.DataFrame() is the same as for col in pandas.DataFrame().columns.

为了解决您的问题,您应该使用 pandas.DataFrame().iterrows() 遍历数据框的列,然后在包含您的元素的行上使用 .sort_values()。您的问题的解决方案如下:

scorecard = pd.DataFrame()
elements = ['element 1', 'element 2', 'element 3']
columns = ['leader', 'Worst performing element', 'Worst performing score', 'Second worst element', 'Second worst score']

for idx, row in data.iterrows():
    # scores sorted in ascending order
    scores = row[elements].sort_values()
    # grab leader value
    leader = row['leader']
    # add values to scorecard
    scorecard.loc[idx, columns] = [leader, scores.index[0], scores.values[0], scores.index[1], scores.values[1]]
    
scorecard

输出:

        leader  Worst performing element    Worst performing score  Second worst element    Second worst score
Unit 1    John                 element 3                      0.32             element 2                  0.55
Unit 2    Jane                 element 2                      0.67             element 3                  0.87
Unit 3     Joe                 element 1                      0.65             element 3                  0.66