如何在Pandas中按条件用city和country列值替换含下划线的temp_id内容
用Pandas实现temp_id列的特定替换需求
需求说明:针对DataFrame中的temp_id列,将所有包含下划线(_)的数值,替换为该temp_id的数字部分 + city列值 + country列值的组合;不包含下划线的数值保持不变,同时注意部分行可能存在city或country为空的情况,这类行的temp_id也保持不变。
原始DataFrame df
temp_id city country 12225IND DELHI IND 14445UX_TY AUSTIN US 56784SIN BEDOK SIN 72312SD_IT_UZ NEW YORK US 47853DUB DUBAI UAE 80976UT_IS_SZ SYDENY AUS 89012TY_JP_IS TOKOYO JPN 51309HJ_IS_IS 42087IND MUMBAI IND
期望输出
temp_id city country 12225IND DELHI IND 14445AUSTINUS AUSTIN US 56784SIN BEDOK SIN 72312NEWYORKUS NEW YORK US 47853DUB DUBAI UAE 80976SYDENYAUS SYDENY AUS 89012TOKOYOJPN TOKOYO JPN 51309HJ_IS_IS 42087IND MUMBAI IND
解决方案代码
通过Pandas的字符串处理方法结合条件筛选即可实现:
import pandas as pd # 先将空字符串转换为缺失值,方便后续判断 df[['city', 'country']] = df[['city', 'country']].replace('', pd.NA) # 提取temp_id开头的连续数字部分 df['temp_num'] = df['temp_id'].str.extract(r'^(\d+)', expand=False) # 定义需要替换的行:temp_id含下划线,且city、country均不为空 replace_mask = df['temp_id'].str.contains('_', na=False) & df['city'].notna() & df['country'].notna() # 执行替换:数字部分 + 去除空格的city + country df.loc[replace_mask, 'temp_id'] = df.loc[replace_mask, 'temp_num'] + \ df.loc[replace_mask, 'city'].str.replace(' ', '') + \ df.loc[replace_mask, 'country'] # 清理临时列(可选) df = df.drop(columns='temp_num') # 查看最终结果 print(df)
代码说明
str.extract(r'^(\d+)'):精准提取temp_id开头的连续数字序列,确保只取需要的前缀部分。- 筛选条件
replace_mask:避免因city或country为空导致拼接出无效值,只处理数据完整的目标行。 str.replace(' ', ''):处理city中带空格的情况(如示例中的NEW YORK),转换成无空格字符串后再拼接,匹配期望输出格式。
内容的提问来源于stack exchange,提问作者aeapen
相关产品推荐
相关产品推荐

