如何在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
相关产品推荐
相关产品推荐

