如何通过Pandas将groupby.ngroup生成的cityID还原为城市名称
用Pandas通过cityID填充df2的城市名称
没问题,这事儿在Pandas里用**映射(mapping)**的方式就能轻松解决,我给你一步步演示:
核心思路
先从原始的df中提取cityID和对应城市名称的映射关系,再用这个映射去替换df2里的city列值。
完整代码示例
import pandas as pd # 模拟你已有的df数据 data_df = { 'names': ['ali', 'john', 'aslam', 'khan', 'umair'], 'city': ['Islamabad', 'lahore', 'Islamabad', 'Peshawar', 'lahore'], 'cityID': [0, 1, 0, 2, 1] } df = pd.DataFrame(data_df) # 模拟你已有的df2数据 data_df2 = { 'cityID': [2,1,2,2,0,1,1,2,1,0,2,0], 'city': ['?']*12 } df2 = pd.DataFrame(data_df2) # 步骤1:从df生成cityID到城市名的映射字典 # 先去重确保每个cityID只对应一个城市,再转成字典 city_mapping = df.drop_duplicates(subset=['cityID']).set_index('cityID')['city'].to_dict() # 步骤2:用映射填充df2的city列 df2['city'] = df2['cityID'].map(city_mapping) # 查看最终结果 print(df2)
代码细节说明
- 生成映射字典:
df.drop_duplicates(subset=['cityID'])先剔除df中重复的cityID行,保证每个cityID只关联一个城市;再通过set_index('cityID')['city'].to_dict()把cityID设为索引,提取city列转成字典,最终得到的结构是{0: 'Islamabad', 1: 'lahore', 2: 'Peshawar'}。 - 填充数据:
df2['cityID'].map(city_mapping)会遍历df2的每一个cityID,自动从字典中匹配对应的城市名,替换掉原来的?。
可选的异常处理
如果df2中存在df里没有的陌生cityID,可以用fillna给这些未知ID设置默认值:
df2['city'] = df2['cityID'].map(city_mapping).fillna('Unknown')
内容的提问来源于stack exchange,提问作者Imran Khan Khattak
相关产品推荐
相关产品推荐

