我有一个带有列表的熊猫列。对包含来自同一列的至少一个公共元素的行进行分组

Posted

技术标签:

【中文标题】我有一个带有列表的熊猫列。对包含来自同一列的至少一个公共元素的行进行分组【英文标题】:I have a pandas column with lists. Group rows that contains atleast one common element from same column 【发布时间】:2020-02-11 10:51:39 【问题描述】:

我有带有 1 列列表的 pandas df。我想对至少有一个共同元素的所有列表进行分组。

Input Df :
> 
    Category
 0  [IAB19, IAB81, IAB82]
 1  [IAB25, IAB27]
 2  [IAB19, IAB20]
 3  [IAB22, IAB55, IAB56, IAB58]
 4  [IAB81, IAB89]
 5  [IAB82, IAB95]

我想知道 df['Category'] 中的任何代码是否存在于 df['Category'] 的任何其他行中。

如果是,我想合并那些共享至少 1 个共同元素的列表。

预期输出:

    Category
 0  [IAB19, IAB81, IAB82, IAB20, IAB89, IAB95]
 1  [IAB25, IAB27]
 2  [IAB22, IAB55, IAB56, IAB58]

有什么想法吗?

【问题讨论】:

您必须构建一个图并对每个不相交图进行分组 在这方面使用 Pandas 没有什么意义 @rafaelc 我们不能使用 substr 或其他东西匹配列表,并在它们匹配的任何地方分配相同的 id。然后使用分配的 id 进行分组? 【参考方案1】:

这是一个隐藏的网络问题,所以我们可以尝试networkx,但在此之前你可能需要explode整个列表列到单行项(功能在pandas之后可用0.25)

import networkx as nx
df['Key']=df.index
df=df.explode('Category')
G=nx.from_pandas_edgelist(df, 'Category', 'Key')
l=list(nx.connected_components(G))
L=[dict.fromkeys(y,x) for x, y in enumerate(l)]
d=k: v for d in L for k, v in d.items()
s=df.groupby(df.Key.map(d)).Category.apply(set)
s
Key
0    IAB89, IAB82, IAB19, IAB95, IAB81, IAB20
1                                IAB27, IAB25
2                  IAB55, IAB56, IAB22, IAB58
Name: Category, dtype: object

【讨论】:

以上是关于我有一个带有列表的熊猫列。对包含来自同一列的至少一个公共元素的行进行分组的主要内容,如果未能解决你的问题,请参考以下文章

来自两列的熊猫数据框类别代码

来自两列的熊猫数据框类别代码

如何在熊猫数据框中使用列表作为值?

如何在熊猫数据框中使用列表作为值?

如何将熊猫中的日期时间列全部转换为同一时区

如何将带有字典列表的熊猫列拆分为每个键的单独列