You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检查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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 19:50:41