如何替换DataFrame中Stuff列方括号内整数为Val列值?
问题描述
现有如下示例DataFrame:
# Create DataFrame from Dict import pandas as pd technologies = { 'Val':[5, 9], 'Stuff':["[demography_form][1]<div></table<text-align>[demography_form_date][1]", "<text-ali>[geography_form][1]<div></table<text-align>[geography_form_date][1]"] } df = pd.DataFrame(technologies)
需要把Stuff列里所有方括号包裹的整数,替换成对应行Val列的数值,替换的整数数量和位置不固定,最终要得到这样的结果:
technologies = { 'Val':[5, 9], 'Stuff':["[demography_form][5]<div></table<text-align>[demography_form_date][5]", "<text-ali>[geography_form][9]<div></table<text-align>[geography_form_date][9]"] } df = pd.DataFrame(technologies)
实现方法
方法一:用apply加正则表达式遍历替换
直接遍历每一行,用正则匹配所有[数字]格式的内容,替换成对应行的Val值:
import re df['Stuff'] = df.apply(lambda row: re.sub(r'\[(\d+)\]', f'[{row["Val"]}]', row['Stuff']), axis=1)
- 正则
r'\[(\d+)\]'专门匹配方括号里的整数 - 每行的替换值都是当前行的
Val,不管有多少个需要替换的位置,一次性搞定
方法二:用str.replace的回调函数(Pandas 1.4.0及以上可用)
如果你的Pandas版本够新(1.4.0+),可以直接用str.replace的回调功能,不用手动遍历行,性能更好:
df['Stuff'] = df['Stuff'].str.replace(r'\[(\d+)\]', lambda m: f'[{df.loc[m.pos, "Val"]}]', regex=True)
m.pos能拿到当前匹配位置对应的行索引,直接取该行的Val值替换
验证结果
运行上面任意一种方法后,打印df就能看到期望的结果:
print(df) # 输出: # Val Stuff # 0 5 [demography_form][5]<div></table<text-align>[d... # 1 9 <text-ali>[geography_form][9]<div></table<text...
内容的提问来源于stack exchange,提问作者Andrea
相关产品推荐
相关产品推荐

