如何实现子字符串列表与DataFrame行字符串的布尔比较?
解决DataFrame行与子字符串列表的布尔匹配问题
嘿,我明白你卡在哪了!问题出在判断逻辑的顺序上,咱们先把需求拆解清楚:我们需要子字符串列表里的每一个子串,都能在当前行的任意一个字符串中找到,而你现在的代码逻辑刚好搞反了,导致明明符合条件的行也返回了False。
问题根源分析
先看你核心的判断代码:
print(all(substring in row_str for substring in substring_list for row_str in combine_row_str))
这个生成器的遍历顺序是:先取一个子串,再挨个检查当前行的所有字符串——只要有一个字符串不包含这个子串,all()就直接返回False了。但我们要的是,每个子串只要能在当前行的某一个字符串里找到就行,而不是要求同一个字符串包含所有子串。
比如第一行里,AE在strings_1的AEAB里,AA在strings_3的AABD里,但你的代码会先检查AA是否在AEAB里(不在),直接判定为False,根本没机会去看后面的AABD。
修正后的代码
我们把判断逻辑调整一下:先对每个子串,检查它是否存在于当前行的任意一个字符串中;再用all()确保所有子串都满足这个条件。代码如下:
import pandas as pd string = {'strings_1': ['AEAB', 'AC', 'AI'], 'strings_2':['BB', 'BA', 'AG'], 'strings_3': ['AABD', 'DD', 'PP'], 'strings_4': ['AV', 'AB', 'BV']} df_string = pd.DataFrame(data = string) substring_list = ['AA', 'AE'] for row in df_string.itertuples(index = False): combine_row_str = [row[0], row[1], row[2]] # 修正逻辑:每个子串至少在一个行字符串中存在,再确保所有子串都满足 all_substrings_found = all(any(substring in s for s in combine_row_str) for substring in substring_list) print(all_substrings_found)
验证输出
运行这段代码后,输出就完全符合你的期望了:
True False False
进阶:更高效的Pandas向量化写法(可选)
如果你的DataFrame数据量比较大,用循环遍历会比较慢,推荐用Pandas的向量化操作来实现,效率更高:
def check_all_substrings(row): return all(any(sub in s for s in row) for sub in substring_list) # 给DataFrame新增布尔结果列 df_string['all_substrings_present'] = df_string.apply(check_all_substrings, axis=1) print(df_string['all_substrings_present'])
输出结果同样是:
0 True 1 False 2 False Name: all_substrings_present, dtype: bool
内容的提问来源于stack exchange,提问作者learner
相关产品推荐
相关产品推荐

