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

如何在Pandas中创建条件文本列?匹配文本生成新列遇空列求助

让我来逐个解决你的两个Pandas问题:

问题1:如何在Pandas中创建条件文本列?

根据条件生成文本列是Pandas里的常见操作,这里分享几个实用的方法,覆盖从简单到复杂的场景:

方法1:用numpy.where()做二元判断

如果你的条件是简单的“是/否”逻辑,np.where()是最简洁高效的选择:

import pandas as pd
import numpy as np

# 示例DataFrame
df = pd.DataFrame({"produto": ["vinho tinto", "vinho branco", "espumante", "vinho tinto"]})

# 创建新列:如果produto包含"vinho",标记为"vinho",否则"outro"
df["tipo"] = np.where(df["produto"].str.contains("vinho"), "vinho", "outro")

方法2:用apply()处理多条件逻辑

如果需要更复杂的多分支判断,自定义函数+apply()的组合更灵活:

def classificar_produto(texto):
    if "tinto" in texto:
        return "vinho tinto"
    elif "branco" in texto:
        return "vinho branco"
    elif "espumante" in texto:
        return "espumante"
    else:
        return "desconhecido"

df["detalhe_tipo"] = df["produto"].apply(classificar_produto)

方法3:用map()做精确匹配映射

如果你的条件是基于精确值的映射(比如字典对应),map()会更高效:

map_dict = {
    "vinho tinto": "tinto",
    "vinho branco": "branco",
    "espumante": "espumante"
}

df["tipo_curto"] = df["produto"].map(map_dict).fillna("desconhecido")

问题2:匹配跨DataFrame文本列生成新列的问题解决

你的代码返回空值的核心原因是没有逐行处理vinhos['regiao']的内容:r in vinhos['regiao']是在检查r是否存在于整个Series的所有值中,而不是检查r是否在当前行的regiao文本里。当没有任何r能在所有regiao行中出现时,就会返回空字符串,导致整列都是空值。

下面是两种正确的解决方案:

方案1:apply()逐行匹配(直观易理解)

先把local['nome']转成列表,然后对每一行的regiao文本遍历查找匹配项:

# 先把地区名称转成列表,方便遍历
regioes_local = local['nome'].tolist()

def encontrar_regiao(texto_regiao):
    # 遍历所有地区,返回第一个匹配的名称
    for reg in regioes_local:
        if reg in texto_regiao:
            return reg
    # 没有匹配项时返回NaN(或你想要的默认值)
    return pd.NA

# 应用到vinhos的每一行
vinhos['reg'] = vinhos['regiao'].apply(encontrar_regiao)

方案2:正则str.extract()(高效适合大数据)

把所有地区名称拼接成正则表达式的备选模式,直接提取匹配内容,效率比apply()高很多:

# 生成正则模式:比如"Vinho Verde|Minho|Douro|Porto"
padrao_regioes = '|'.join(local['nome'].tolist())

# 提取第一个匹配的地区名称,expand=False返回Series
vinhos['reg'] = vinhos['regiao'].str.extract(f'({padrao_regioes})', expand=False)

测试你的示例

对于vinhos['regiao']中的"Douro tinto 2014",两种方案都会正确提取出"Douro",完全符合你的预期。


内容的提问来源于stack exchange,提问作者Hugo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:32:05