如何用Python按Country列分组生成递增ID字段?
按国家生成独立递增前缀ID的解决方案
问题根源
你原代码的问题在于用了全局递增的变量i,每次循环都会把对应国家的所有行ID覆盖为当前i的值,最终每个国家的ID都变成了同一个全局序号,完全不符合每个国家独立计数的需求。
最优解决方案(Pandas向量化操作)
用groupby加cumcount是最符合Pandas风格且高效的写法,无需循环:
# 定义国家与前缀的映射关系 country_prefix = { 'Germany': 'GR', 'Italy': 'IT', 'France': 'FR' } # 1. 按Country分组,生成每组内从1开始的递增序号 new_cols5['ID'] = new_cols5.groupby('Country').cumcount() + 1 # 2. 映射前缀并拼接成最终ID new_cols5['ID'] = new_cols5['Country'].map(country_prefix) + new_cols5['ID'].astype(str)
运行后得到的结果完全符合预期:
| ID | Country |
|---|---|
| GR1 | Germany |
| FR1 | France |
| IT1 | Italy |
| GR2 | Germany |
| FR2 | France |
| IT2 | Italy |
循环实现方案(不推荐,仅作参考)
如果一定要用循环,需要用字典单独记录每个国家的计数,避免全局变量干扰:
country_prefix = { 'Germany': 'GR', 'Italy': 'IT', 'France': 'FR' } # 初始化每个国家的计数器 country_counter = {country: 0 for country in country_prefix.keys()} # 遍历每一行生成ID for idx, row in new_cols5.iterrows(): country = row['Country'] country_counter[country] += 1 new_cols5.loc[idx, 'ID'] = f"{country_prefix[country]}{country_counter[country]}"
注意事项
优先使用groupby的向量化方案,当数据量较大时,循环的效率会远低于Pandas的内置分组操作。
内容的提问来源于stack exchange,提问作者HazeLand
相关产品推荐
相关产品推荐

