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

如何在DataFrame多列中提取含指定子串的单元格并生成新列

在Pandas中提取每行含指定子串的单元格内容到新列

问题背景

给定多列文本的DataFrame,需为每行找到包含指定子串(示例为"eat",忽略大小写)的单元格,将其完整内容复制到新列,且每行仅存在一个匹配项。

示例数据构建

先还原示例DataFrame:

import pandas as pd

data = {
    'a': ['I eat', 'I am running', 'I sleep', 'Eat', 'I sing'],
    'b': ['I am singing', 'I have eaten', 'I see', 'I Run', 'was eaten'],
    'c': ['Run', 'Sleep', 'I am eating', 'I am Seeing', 'I am Sleeping']
}
df = pd.DataFrame(data, index=[1,2,3,4,5])

实现方法

方法一:逐行处理(简单直观)

使用apply逐行遍历,筛选匹配的单元格:

target_sub = 'eat'
df['New column'] = df.apply(lambda row: row[row.str.contains(target_sub, case=False)].iloc[0], axis=1)
  • row.str.contains(target_sub, case=False):检查该行每个元素是否包含目标子串,case=False忽略大小写匹配
  • row[布尔筛选结果]:提取该行中匹配的元素
  • .iloc[0]:因每行仅一个匹配,直接取唯一结果

方法二:堆叠优化(高效适合大数据集)

利用stack将列转为行维度,批量筛选后重新映射:

target_sub = 'eat'
# 堆叠数据并筛选匹配项
matched_series = df.stack().str.contains(target_sub, case=False)
# 提取匹配内容并还原原索引
df['New column'] = df.stack()[matched_series].reset_index(level=1, drop=True)

这种方式避免了逐行循环,在数据量较大时性能更优。

最终结果

执行后得到的DataFrame与需求示例完全一致:

a                b              c       New column
1           I eat  I am singing           Run              I eat
2  I am running     I have eaten        Sleep     I have eaten
3        I sleep         I see      I am eating    I am eating
4            Eat          I Run    I am Seeing             Eat
5         I sing      was eaten  I am Sleeping      was eaten

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 06:16:20