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

