![](/img/trans.png)
[英]Grabbing the Highest value in Excel Column and display Row Name using Python/Pandas
[英]Python pandas: keep row with highest column value
假設我有一個學生考試成績的數據框,其中每個學生都學習不同的科目。 每個學生可以多次參加每個科目的考試,並且只會保留最高分(滿分100分)。 例如,假設我有所有測試記錄的數據框:
| student_name | subject | test_number | score |
|--------------|---------|-------------|-------|
| sarah | maths | test1 | 78 |
| sarah | maths | test2 | 71 |
| sarah | maths | test3 | 83 |
| sarah | physics | test1 | 91 |
| sarah | physics | test2 | 97 |
| sarah | history | test1 | 83 |
| sarah | history | test2 | 87 |
| joan | maths | test1 | 83 |
| joan | maths | test2 | 88 |
(1)如何僅保留得分最高的測試記錄(行)? 那是,
| student_name | subject | test_number | score |
|--------------|---------|-------------|-------|
| sarah | maths | test1 | 78 |
| sarah | maths | test2 | 71 |
| sarah | maths | test3 | 83 |
| sarah | physics | test1 | 91 |
(2)如何保持同一科目的同一學生參加的所有考試的平均值 ? 那是:
| student_name | subject | test_number | ave_score |
|--------------|---------|-------------|-----------|
| sarah | maths | na | 77.333 |
| sarah | maths | na | 94 |
| sarah | maths | na | 85 |
| sarah | physics | na | 85.5 |
我嘗試了df.sort_values()
和df.drop_duplicates(subset=..., keep=...)
各種組合,但都無濟於事。
實際數據
| query | target | pct-similarity | p-val | aln_length | bit-score |
|-------|----------|----------------|-------|------------|-----------|
| EV239 | B/Fw6/623 | 99.23 | 0.966 | 832 | 356 |
| EV239 | B/Fw6/623 | 97.34 | 0.982 | 1022 | 739 |
| EV239 | MMS-alpha | 92.23 | 0.997 | 838 | 384 |
| EV239 | MMS-alpha | 93.49 | 0.993 | 1402 | 829 |
| EV380 | B/Fw6/623 | 94.32 | 0.951 | 324 | 423 |
| EV380 | B/Fw6/623 | 95.27 | 0.932 | 1245 | 938 |
| EV380 | MMS-alpha | 99.23 | 0.927 | 723 | 522 |
| EV380 | MMS-alpha | 99.15 | 0.903 | 948 | 1092 |
應用聚合函數后,將僅關注列pct-similarity
。
(1)通過選擇最大aln_length
刪除重復的查詢+目標行。 保留屬於具有最大aln_length
的行的pct-similarity
值。
(2)通過選擇具有最大aln_length
的行並計算該組重復行的平均pct-similarity
,匯總重復的查詢+目標行。 其他數字列不是必需的,最終將被刪除,因此我真的不在乎將什么聚合函數(最大值或平均值)應用於它們。
只需對每個學生/主題組使用max()
:
df.groupby(["student_name","subject"], as_index=False).max()
student_name subject test_number score
0 joan maths test2 88
1 sarah history test2 87
2 sarah maths test3 83
3 sarah physics test2 97
對於平均值,請改用mean()
:
df.groupby(["student_name","subject"], as_index=False).mean()
student_name subject score
0 joan maths 85.500000
1 sarah history 85.000000
2 sarah maths 77.333333
3 sarah physics 94.000000
最有可能describe
df.groupby(["student_name","subject"]).score.describe()
Out[15]:
count mean std min 25% 50% \
student_name subject
joan maths 2.0 85.500000 3.535534 83.0 84.25 85.5
sarah history 2.0 85.000000 2.828427 83.0 84.00 85.0
maths 3.0 77.333333 6.027714 71.0 74.50 78.0
physics 2.0 94.000000 4.242641 91.0 92.50 94.0
75% max
student_name subject
joan maths 86.75 88.0
sarah history 86.00 87.0
maths 80.50 83.0
physics 95.50 97.0
並與drop_duplicates
df.sort_values('score').drop_duplicates(["student_name","subject"],keep='last')
Out[22]:
student_name subject test_number score
2 sarah maths test3 83
6 sarah history test2 87
8 joan maths test2 88
4 sarah physics test2 97
對於帶有reindex
mean
df.groupby(["student_name","subject"], as_index=False).mean().reindex(columns=df.columns)
Out[24]:
student_name subject test_number score
0 joan maths NaN 85.500000
1 sarah history NaN 85.000000
2 sarah maths NaN 77.333333
3 sarah physics NaN 94.000000
我們可以在groupby
上使用agg
來獲取'idxmax'
和'mean'
。
這樣,我們可以執行內部聯接以獲取正確的行和均值。
df.join(
df.groupby(['student_name', 'subject'])
.score.agg(['idxmax', 'mean']).set_index('idxmax'),
how='inner'
)
student_name subject test_number score mean
2 sarah maths test3 83 77.333333
4 sarah physics test2 97 94.000000
6 sarah history test2 87 85.000000
8 joan maths test2 88 85.500000
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.