在Pandas中按国家-团队分组并按颜色规则连续编号
解决方案
核心思路是利用Pandas的有序分类类型保证Color的自定义排序,再结合分组后的rank(method='dense')实现连续编号逻辑。以下是具体步骤:
1. 确认基础步骤(匹配你已完成的操作)
先按ID字母排序,并将Color列转为指定顺序的有序分类:
import pandas as pd # 替换为你的实际数据 data = { 'ID': ['B1', 'A2', 'C3', 'D4', 'E5', 'F6', 'G7', 'H8'], 'Country': ['USA', 'USA', 'USA', 'Canada', 'Canada', 'Canada', 'Mexico', 'Mexico'], 'Team': ['Red', 'Blue', 'Red', 'Green', 'Yellow', 'Green', 'Purple', 'Orange'], 'Color': ['Blue', 'Red', 'Blue', 'Yellow', 'Green', 'Yellow', 'Orange', 'Orange'] } df = pd.DataFrame(data) # 你的自定义Color顺序 colorcode = ['Red', 'Blue', 'Green', 'Yellow', 'Orange', 'Purple'] # 按ID字母排序 df = df.sort_values('ID').reset_index(drop=True) # 将Color转为有序分类,确保排序遵循你定义的colorcode df['Color'] = pd.Categorical(df['Color'], categories=colorcode, ordered=True)
2. 生成Result列
通过分组+稠密排名直接实现需求:
# 按Country分组,对Color进行稠密排名——相同Color同编号、连续递增、换Country重置 df['Result'] = df.groupby('Country')['Color'].rank(method='dense', ascending=True).astype(int)
逻辑说明
- 有序分类:将Color转为
pd.Categorical并指定categories=colorcode,确保排名时严格遵循你定义的Color顺序,而非默认的字母顺序。 - 稠密排名(dense):
rank(method='dense')会为相同的Color分配相同编号,且编号连续不跳过(比如1、2、2、3,而非1、2、2、4),完美匹配"同一Color编号相同、同一国家内编号不重置"的要求。 - 分组重置:
groupby('Country')保证每个国家内的编号独立计算,切换到新Country时编号自动从1重新开始。
示例输出
执行上述代码后,最终DataFrame如下:
| ID | Country | Team | Color | Result |
|---|---|---|---|---|
| A2 | USA | Blue | Red | 1 |
| B1 | USA | Red | Blue | 2 |
| C3 | USA | Red | Blue | 2 |
| D4 | Canada | Green | Yellow | 2 |
| E5 | Canada | Yellow | Green | 1 |
| F6 | Canada | Green | Yellow | 2 |
| G7 | Mexico | Purple | Orange | 1 |
| H8 | Mexico | Orange | Orange | 1 |
完全符合你要求的所有规则。
内容的提问来源于stack exchange,提问作者Kai
相关产品推荐
相关产品推荐

