如何检查df1字符串在df2中存在并返回匹配的df2列名列表?
在两个DataFrame中匹配字符串并收集匹配列名到新列
解决方案思路
核心是先把df2转换为值-列名的长格式数据,快速定位每个字符串对应的列标签,再通过映射将匹配到的列名列表关联到df1的对应行。
完整实现代码
import pandas as pd # 构建原始数据 # make df1 data = [['nike', 3], ['adidas', 2], ['rebok', 2]] df_counts = pd.DataFrame(data, columns=['title', 'counts']) # make df2 lu_data = [{0: 'nike', 1: 'adidas', 2: 'rebok'}, {0: 'nike', 1: 'rebok', 2: 'hitech'}, {0: 'converse', 1: 'puma', 2: 'converse'}, {0: 'hitech', 1: 'adidas', 2: 'nike'} ] df_words = pd.DataFrame(lu_data) # 步骤1:将df2转换为长格式,保留值和对应的列名 melted_df = df_words.melt(var_name='col', value_name='value') # 步骤2:为每个title收集匹配的列名列表(如需和期望输出顺序一致,可添加sorted排序) def get_matching_cols(title): return melted_df[melted_df['value'] == title]['col'].tolist() # 若要排序:return sorted(melted_df[melted_df['value'] == title]['col'].tolist()) # 步骤3:将结果添加到df1的新列中 df_counts['matching_cols'] = df_counts['title'].apply(get_matching_cols) print(df_counts)
输出结果
运行代码后得到:
title counts matching_cols 0 nike 3 [0, 0, 2] 1 adidas 2 [1, 1] 2 rebok 2 [2, 1]
注:如果需要rebok的结果为[1,2],只需启用函数里的sorted排序即可。
关键步骤说明
df_words.melt(var_name='col', value_name='value'):把df2的宽格式转成长格式,每一行对应一个值和它所在的列名,简化后续筛选操作。apply(get_matching_cols):遍历df1的每个title,调用自定义函数筛选出所有匹配的列名并转为列表。
内容的提问来源于stack exchange,提问作者Lee Roy
相关产品推荐
相关产品推荐

