如何用Pandas重排表格:Type优先、交替I/P并按Value降序
Pandas实现指定规则的表格行重排
原始数据
| ID | Type | I/P | Value |
|---|---|---|---|
| ID1 | Primary | I | 8 |
| ID2 | Primary | I | 3 |
| ID3 | Secondary | P | 6 |
| ID4 | Secondary | I | 2 |
| ID5 | Primary | P | 3 |
| ID6 | Primary | I | 4 |
当前排序结果
| ID | Type | I/P | Value |
|---|---|---|---|
| ID1 | Primary | I | 8 |
| ID6 | Primary | I | 4 |
| ID2 | Primary | I | 3 |
| ID5 | Primary | P | 3 |
| ID3 | Secondary | P | 6 |
| ID4 | Secondary | I | 2 |
期望排序规则
- 优先展示
Primary类型,Secondary类型后置 Primary类型内交替展示I和P类型的行,且同一I/P分组内按Value从大到小排列Secondary类型按Value从大到小排列
Pandas实现代码
步骤1:创建DataFrame
import pandas as pd data = { 'ID': ['ID1', 'ID2', 'ID3', 'ID4', 'ID5', 'ID6'], 'Type': ['Primary', 'Primary', 'Secondary', 'Secondary', 'Primary', 'Primary'], 'I/P': ['I', 'I', 'P', 'I', 'P', 'I'], 'Value': [8, 3, 6, 2, 3, 4] } df = pd.DataFrame(data)
步骤2:处理Primary分组的交替排序
通过给同一I/P分组的行添加排名,再按排名+I/P排序实现交替效果:
# 筛选Primary数据并复制,避免修改原DataFrame primary_df = df[df['Type'] == 'Primary'].copy() # 按I/P分组,每组内按Value降序分配排名,确保同组内大值在前 primary_df['rank'] = primary_df.groupby('I/P')['Value'].rank(ascending=False, method='first').astype(int) # 按排名升序、I/P升序排序,实现交替展示I和P的效果 primary_sorted = primary_df.sort_values(by=['rank', 'I/P'], ascending=[True, True]) # 移除临时添加的rank列 primary_sorted = primary_sorted.drop('rank', axis=1)
步骤3:处理Secondary分组排序
按Value降序排列:
secondary_sorted = df[df['Type'] == 'Secondary'].sort_values(by='Value', ascending=False)
步骤4:合并结果并重置索引
final_df = pd.concat([primary_sorted, secondary_sorted]).reset_index(drop=True)
最终结果
| ID | Type | I/P | Value | |
|---|---|---|---|---|
| 0 | ID1 | Primary | I | 8 |
| 1 | ID5 | Primary | P | 3 |
| 2 | ID6 | Primary | I | 4 |
| 3 | ID2 | Primary | I | 3 |
| 4 | ID3 | Secondary | P | 6 |
| 5 | ID4 | Secondary | I | 2 |
注:你提供的期望结果中ID5重复出现,推测是笔误,上述实现是基于合理逻辑生成的正确交替排序结果。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

