根据重叠目标将多个索引折叠成组

Posted

技术标签:

【中文标题】根据重叠目标将多个索引折叠成组【英文标题】:Collapsing multiple indices into groups based on overlapping targets 【发布时间】:2019-07-22 14:59:33 【问题描述】:

我目前正在查看我的数据集中的特征之间的相关性,并且需要将具有相似目标的特征分组到更大的超组中,以便进行更一般的相关性分析。

这些特征是一个热编码的,并且在一个看起来类似于这样的 pandas 数据帧中:

  1 2 3 4 5 6 7 8 9
A 0 0 1 0 0 1 0 1 0
B 0 0 0 1 0 0 0 0 0
C 1 0 0 0 1 0 0 0 0
D 1 0 0 1 0 0 0 0 0
E 0 1 0 1 0 0 0 0 1

我希望生成的数据框如下所示:

               1 2 3 4 5 6 7 8 9
group1(A)      0 0 1 0 0 1 0 1 0
group2(B,D,E,C)1 1 0 1 1 0 0 0 1

我已经尝试过所有形式的groupby以及networkx中的一些方法。

【问题讨论】:

【参考方案1】:

这是一个隐藏的网络问题,所以我们在merge之后使用networkx

s=df.reset_index().melt('index')
s=s.loc[s.value==1]
s=s.merge(s,on = 'variable')

import networkx as nx
G=nx.from_pandas_edgelist(s, 'index_x', 'index_y')


l=list(nx.connected_components(G))
from collections import ChainMap

L=dict(ChainMap(*[dict.fromkeys(y,x) for x, y in enumerate(l)]))


df.groupby(L).sum().ge(1).astype(int)
Out[133]: 
   1  2  3  4  5  6  7  8  9
0  1  1  0  1  1  0  0  0  1
1  0  0  1  0  0  1  0  1  0

L
Out[134]: 'A': 1, 'B': 0, 'C': 0, 'D': 0, 'E': 0

【讨论】:

相关问题,我怎样才能再次对特征进行分组,但这次是以组合方式,每个组是由可以从数据帧形成的不同组的数量构成的? @petrepage 你的意思是再次按索引分组?但是这次0到n的索引号是唯一的 很好@WeNYoBen 确定了这个问题的类型。 +1

以上是关于根据重叠目标将多个索引折叠成组的主要内容,如果未能解决你的问题,请参考以下文章

ListView 重叠折叠工具栏

折叠和合并重叠的时间间隔

基于索引的非重叠滑动窗口

如何解决 Swift Package Manager 目标重叠源错误

用于折叠一组可能重叠的范围的好的通用算法是啥?

windows的重叠IO模型