我正在尝试检查两个数据帧之间的字符串匹配,并返回在其中找到匹配的列的名称。
我需要包括在一个精确匹配中找到的所有匹配,以便在df1中作为列表返回。
我的数据帧
df1(要查找的数据在标题栏中(
title counts
0 nike 3
1 adidas 2
2 rebok 2
df2(在中搜索匹配项的数据帧(
0 1 2
0 nike adidas rebok
1 nike rebok hitech
2 converse puma converse
3 hitech adidas nike
所需输出
title counts matching_cols
0 nike 3 [0,0,2]
1 adidas 2 [1,1]
2 rebok 2 [1,2]
最小再现性示例
# 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)
我尝试过的:我在stackoverflow/google上读了很多类似的帖子,有点卡住了。我遇到的问题是,大多数解决方案都希望匹配列的名称,而我不希望在字符串匹配时返回列的名称。
Melt
数据帧,然后groupby
和agg与list
一起创建一个映射dict,将标题映射到列名列表,然后使用该dict替换df_counts
的title
列中的值
d = df_words.melt().groupby('value')['variable'].agg(list)
df_counts['matching_cols'] = df_counts['title'].map(d)
结果
title counts matching_cols
0 nike 3 [0, 0, 2]
1 adidas 2 [1, 1]
2 rebok 2 [1, 2]