You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python遍历pandas DataFrame时通过if语句查找字符串子串问题

问题原因与解决方案

核心错误原因

你写的代码存在两个致命问题:

  1. 循环遍历过程中直接对df['New Column']整列赋值,每一次赋值都会覆盖整列所有行的数值,最终整列的结果完全等于最后一次循环的赋值结果,只要最后一次循环走到else分支,整列就都会是Not Applicable。
  2. 你只写了判断逻辑,没有写对应的字符串提取逻辑,就算命中关键词也拿不到正确的新列值。

最优解决方案

不推荐用循环遍历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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 12:45:03