如何在Pandas DataFrame中检测同列子串并生成对应新列
解决DataFrame中子串匹配并生成对应长字符串的问题
没问题,我来帮你搞定这个需求!你需要检测col1中每个字符串是否是同列其他字符串的子串,并在col2中存储对应的匹配长字符串(如果没有匹配项则保留原字符串),下面是具体的实现方案:
步骤1:构造示例DataFrame
首先我们先还原你的示例数据:
import pandas as pd data = {'col1': ['donald', 'mike', 'donald trump', 'trump', 'mike pence', 'pence', 'jarred']} df1 = pd.DataFrame(data)
步骤2:编写匹配逻辑
核心思路是:先把所有字符串按长度降序排序(这样更长的字符串会被优先检查,避免短字符串被误匹配),然后对每个字符串,找到第一个包含它且不等于它的候选字符串,找不到就返回原字符串。
实现代码如下:
def find_matching_long_string(s, sorted_strings): # 遍历排序后的字符串列表,找第一个包含当前字符串的非自身候选 for candidate in sorted_strings: if s != candidate and s in candidate: return candidate # 没有找到匹配项,返回原字符串 return s # 按字符串长度从长到短排序 sorted_str_list = sorted(df1['col1'], key=lambda x: -len(x)) # 应用函数生成col2 df1['col2'] = df1['col1'].apply(lambda x: find_matching_long_string(x, sorted_str_list))
步骤3:查看结果
运行上述代码后,打印df1就能得到你想要的结果:
print(df1)
输出结果:
col1 col2 0 donald donald trump 1 mike mike pence 2 donald trump donald trump 3 trump donald trump 4 mike pence mike pence 5 pence mike pence 6 jarred jarred
这个方案完美匹配你的需求,每个子串都能对应到包含它的最长字符串,没有匹配项的jarred也保留了原内容。
内容的提问来源于stack exchange,提问作者Ronnie
相关产品推荐
相关产品推荐

