如何在Pandas中根据城市列的字符串值创建新分组列?
Pandas实现基于指定城市分组创建新列
问题描述
现有如下结构的DataFrame:
| type | city |
|---|---|
| 1 | dki jakarta |
| 2 | jawa barat |
| 3 | jawa tengah |
| 4 | jawa timur |
| 5 | sulawesi |
需要基于city列创建名为city_group的新列,分组规则如下:
- dki jakarta、jawa barat →
jabo, jabar - jawa tengah、jawa timur →
jateng, jatim - sulawesi →
others
期望得到的结果:
| type | city | city_group |
|---|---|---|
| 1 | dki jakarta | jabo, jabar |
| 2 | jawa barat | jabo, jabar |
| 3 | jawa tengah | jateng, jatim |
| 4 | jawa timur | jateng, jatim |
| 5 | sulawesi | others |
当前尝试的代码仅能匹配单个字符串,需要扩展多匹配条件:
df.loc[df['city'].str.contains("dki jakarta"),'city_group'] = 'jabo, jabar'
解决方案
以下是几种可行的实现方式:
方法1:扩展str.contains的多匹配规则
利用正则表达式的管道符|分隔多个匹配目标,依次设置分组值,最后填充未匹配项:
import pandas as pd # 构造原始数据 data = { 'type': [1,2,3,4,5], 'city': ['dki jakarta', 'jawa barat', 'jawa tengah', 'jawa timur', 'sulawesi'] } df = pd.DataFrame(data) # 匹配第一组城市 df.loc[df['city'].str.contains('dki jakarta|jawa barat'), 'city_group'] = 'jabo, jabar' # 匹配第二组城市 df.loc[df['city'].str.contains('jawa tengah|jawa timur'), 'city_group'] = 'jateng, jatim' # 剩余未匹配项设为others df['city_group'] = df['city_group'].fillna('others')
方法2:使用映射字典(推荐,规则清晰)
创建城市与分组的映射字典,通过map方法直接赋值,未匹配项用fillna补充:
import pandas as pd data = { 'type': [1,2,3,4,5], 'city': ['dki jakarta', 'jawa barat', 'jawa tengah', 'jawa timur', 'sulawesi'] } df = pd.DataFrame(data) # 定义城市-分组映射 city_group_map = { 'dki jakarta': 'jabo, jabar', 'jawa barat': 'jabo, jabar', 'jawa tengah': 'jateng, jatim', 'jawa timur': 'jateng, jatim', 'sulawesi': 'others' } # 应用映射 df['city_group'] = df['city'].map(city_group_map).fillna('others')
方法3:使用numpy.select处理多条件分支
通过条件列表和对应值列表批量设置分组,适合更复杂的多分支场景:
import pandas as pd import numpy as np data = { 'type': [1,2,3,4,5], 'city': ['dki jakarta', 'jawa barat', 'jawa tengah', 'jawa timur', 'sulawesi'] } df = pd.DataFrame(data) # 定义条件和对应值 conditions = [ df['city'].isin(['dki jakarta', 'jawa barat']), df['city'].isin(['jawa tengah', 'jawa timur']) ] group_values = [ 'jabo, jabar', 'jateng, jatim' ] # 应用多条件赋值,默认值为others df['city_group'] = np.select(conditions, group_values, default='others')
方法对比
- 映射字典:代码最直观,维护成本低,适合城市列表固定的场景。
- str.contains:支持模糊匹配(比如城市名有拼写变体时),灵活性更强。
- numpy.select:适合多条件嵌套的复杂分组逻辑,可读性好。
内容的提问来源于stack exchange,提问作者yangyang
相关产品推荐
相关产品推荐

