如何在DataFrame中移除某列开头与另一列相同的文本?
解决Pandas DataFrame中移除var1列重复前缀的问题
先明确需求:当DataFrame的var1列文本以对应行name列的文本开头时,移除这个重复的前缀部分,保留后续内容。
示例输入
name var1 John Smith John Smith Hello world Mary Jane Mary Jane Python is cool James Bond My name is James Bond Peter Pan Nothing happens here
期望输出
name var1 John Smith Hello world Mary Jane Python is cool James Bond My name is James Bond Peter Pan Nothing happens here
你之前用的df[~df.var1.str.contains(df.var1)]逻辑完全不对——这行代码是试图筛选var1不包含自身的行,显然和需求不沾边,而且str.contains直接传入Series也没法实现逐行的前缀匹配。
下面是两种可行的实现方式:
方法一:逐行处理(直观易懂)
适合小数据集,逻辑清晰:
import pandas as pd # 构造示例数据 data = { 'name': ['John Smith', 'Mary Jane', 'James Bond', 'Peter Pan'], 'var1': ['John Smith Hello world', 'Mary Jane Python is cool', 'My name is James Bond', 'Nothing happens here'] } df = pd.DataFrame(data) # 处理逻辑 df['var1'] = df.apply( lambda row: row['var1'][len(row['name']):].strip() if row['var1'].startswith(row['name']) else row['var1'], axis=1 ) print(df)
核心逻辑:用apply(axis=1)逐行遍历,先通过startswith判断var1是否以当前行的name开头,匹配的话就从name长度的位置截取后续文本,再用strip()去掉前缀后面多余的空格;不匹配则直接保留原内容。
方法二:向量化操作(高效适合大数据集)
利用Pandas的向量化API,避免逐行循环,效率更高:
import pandas as pd import numpy as np # 构造示例数据 data = { 'name': ['John Smith', 'Mary Jane', 'James Bond', 'Peter Pan'], 'var1': ['John Smith Hello world', 'Mary Jane Python is cool', 'My name is James Bond', 'Nothing happens here'] } df = pd.DataFrame(data) # 生成匹配掩码:筛选出var1以对应name开头的行 mask = df['var1'].str.startswith(df['name']) # 对匹配到的行进行截取和去空格处理 df.loc[mask, 'var1'] = df.loc[mask, 'var1'].str[df.loc[mask, 'name'].str.len():].str.strip() print(df)
核心逻辑:先用str.startswith生成布尔掩码,定位需要处理的行;然后对这些行的var1,根据对应name的长度截取后续内容,最后去除多余空格。这种方式没有循环,处理大数据集时性能更优。
内容的提问来源于stack exchange,提问作者MG Fern
相关产品推荐
相关产品推荐

