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