我有一個獨特的資料框:
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 的行,否則洗掉它們。
例如,對于 student 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)
任何建議,將不勝感激。謝謝!
uj5u.com熱心網友回復:
您可以首先沿列對資料框進行排序,以便使用sort_index. 然后,您可以獲得min(1)每個學生的分數以及出現最小值的相應列,使用idxmin(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 的第一列進行比較,這將顯示最大分數是否發生在最小分數之后,并比較這些分數之間的差異是否大于 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
uj5u.com熱心網友回復:
嘗試:
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/383072.html
下一篇:多串列示一個值時的頻率表(R)
