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
我正在尝试生成一个 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 asfor 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