如何在合并方面处理 Python Pandas Dataframe 中的无序标签集

How to handle unordered sets of tags in Python Pandas Dataframe in terms of merging

提问人:Melon Pie 提问时间:11/9/2023 更新时间:11/9/2023 访问量:38

问:

我有两个数据帧,其中一列包含标签。标记可以在列表中存在或不存在,并且以无序方式存储。我想将两个数据集与具有相同标签的行合并。在普通的python中,我可以将它们存储为set数据类型。

tags1 = {"tag1","tag2"}
tags2 = {"tag2","tag1"}
tags1 == tags2
True

但是,我不能在 Pandas 中做同样的事情,因为集合是不可散列的。

df1 = pd.DataFrame([{'name': 'foo', 'tags': {"tag1","tag2"}}, {'name': 'bar', 'tags': {"tag3","tag4"}}])
df2 = pd.DataFrame([{'name': 'baz', 'tags': {"tag4","tag3"}}, {'name': 'qux', 'tags': {"tag5","tag6"}}])
df1.merge(df2, how="inner", indicator=True, on="tags")

我想看到的

     name_x  value           name_y _merge
0    bar     {"tag3","tag4"} baz    both

我得到什么

TypeError: unhashable type: 'set'

这里最好的方法是什么?不幸的是,由于标签的数量不是固定的,因此我无法定义固定数量的列。

Python Pandas DataFrame 无序

评论

2赞 Corralien 11/9/2023
然后将你的转换为可哈希的。setfrozensetmerge

答:

1赞 jezrael 11/9/2023 #1

如果需要原始 s 列,请使用 frozensets 并分配给 和 参数:left_onright_onset

out = (df1.merge(df2, how="inner", indicator=True, 
                left_on=df1['tags'].apply(frozenset),
                right_on=df2['tags'].apply(frozenset)))
print (out)
          key_0 name_x        tags_x name_y        tags_y _merge
0  (tag3, tag4)    bar  {tag3, tag4}    baz  {tag3, tag4}   both

或者将 s 分配给列:frozensettags

out = (df1.assign(tags=df1['tags'].apply(frozenset))
          .merge(df2.assign(tags=df2['tags'].apply(frozenset)), 
                how="inner", 
                indicator=True, 
                on="tags"))
print (out)
  name_x          tags name_y _merge
0    bar  (tag3, tag4)    baz   both