提问人:Melon Pie 提问时间:11/9/2023 更新时间:11/9/2023 访问量:38
如何在合并方面处理 Python Pandas Dataframe 中的无序标签集
How to handle unordered sets of tags in Python Pandas Dataframe in terms of merging
问:
我有两个数据帧,其中一列包含标签。标记可以在列表中存在或不存在,并且以无序方式存储。我想将两个数据集与具有相同标签的行合并。在普通的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'
这里最好的方法是什么?不幸的是,由于标签的数量不是固定的,因此我无法定义固定数量的列。
答:
1赞
jezrael
11/9/2023
#1
如果需要原始 s 列,请使用 frozenset
s 并分配给 和 参数:left_on
right_on
set
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 分配给列:frozenset
tags
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
评论
set
frozenset
merge