Python遍历pandas DataFrame时通过if语句查找字符串子串问题
问题原因与解决方案
核心错误原因
你写的代码存在两个致命问题:
- 循环遍历过程中直接对
df['New Column']整列赋值,每一次赋值都会覆盖整列所有行的数值,最终整列的结果完全等于最后一次循环的赋值结果,只要最后一次循环走到else分支,整列就都会是Not Applicable。 - 你只写了判断逻辑,没有写对应的字符串提取逻辑,就算命中关键词也拿不到正确的新列值。
最优解决方案
不推荐用循环遍历pandas列,直接用pandas原生向量化字符串方法,性能更高、逻辑更简洁:
import pandas as pd # 构造示例数据,实际使用时替换成你自己的DataFrame即可 df = pd.DataFrame({ 'Variable': [ 'Religion - Buddhism', 'Source: Clickerz', 'Religion - Islam', 'Source: SRZ FREE', 'Ethnicity - Mixed - White & Black African' ] }) # 1. 用正则统一匹配两种分隔符:冒号+空格、横杠+空格,拆分出分类和值两部分 df[['temp_category', 'temp_value']] = df['Variable'].str.split(r'\s*[:-]\s*', n=1, expand=True) # 2. 替换值中的HTML转义字符&为and df['New Column'] = df['temp_value'].str.replace('&', 'and', regex=False) # 3. 按你的需求把原Variable列替换为分类值,不需要的话可以删掉这行 df['Variable'] = df['temp_category'] # 4. 清理临时列 df = df.drop(columns=['temp_category', 'temp_value'])
循环写法修复方案
如果你一定要用循环实现,需要按索引给单独的行赋值,不要整列覆盖:
# 先初始化新列 df['New Column'] = '' # 用iterrows遍历可以同时拿到行索引和行内容 for idx, row in df.iterrows(): var_str = row['Variable'] if 'Religion' in var_str: res = var_str.split(' - ', 1)[1] elif 'Ethnicity' in var_str: res = var_str.split(' - ', 1)[1].replace('&', 'and') elif 'Source' in var_str: res = var_str.split(': ', 1)[1] else: res = 'Not Applicable' # 只给当前索引对应的行赋值 df.loc[idx, 'New Column'] = res
内容的提问来源于stack exchange,提问作者Elliott Davey
相关产品推荐
相关产品推荐

