检查df1中的字符串是否存在于df2中的任何位置,并返回df1中匹配的列名



我正在尝试检查两个数据帧之间的字符串匹配,并返回在其中找到匹配的列的名称。

我需要包括在一个精确匹配中找到的所有匹配,以便在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_countstitle列中的值

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]

最新更新