Python 如何将相关子列表的唯一ID赋予共享注释元素的子列表的每个元素?

Python 如何将相关子列表的唯一ID赋予共享注释元素的子列表的每个元素?,python,pandas,performance,networkx,subgraph,Python,Pandas,Performance,Networkx,Subgraph,在由成对项目组成的约500k行列表中,我试图建立一个文件,旨在为每个项目分配与其所属组相关的ID。下文将作进一步解释 我需要一些帮助才能以一种聪明而有效的方式得到结果(即pythonic) ============== 我想做什么 将输入文件df0转换为所需输出df2 例如,起始文件看起来像这样(但有500k个条目),其中从item1到item2的关系由数据帧的结构决定 df0:输入 df0 = pd.DataFrame({ "item 1": ['Q', 'R', 'B', 'A'], "it

在由成对项目组成的约500k行列表中,我试图建立一个文件,旨在为每个项目分配与其所属组相关的ID。下文将作进一步解释

我需要一些帮助才能以一种聪明而有效的方式得到结果(即pythonic)

==============

我想做什么 将输入文件df0转换为所需输出df2

例如,起始文件看起来像这样(但有500k个条目),其中从item1到item2的关系由数据帧的结构决定

df0:输入

df0 = pd.DataFrame({
"item 1": ['Q', 'R', 'B', 'A'],
"item 2": ['R', 'P', 'A', 'C']
})
df2 = pd.DataFrame({
"items": ['Q', 'R', 'P', 'B', 'A', 'C' ],
"group": [1, 1, 1, 2, 2, 2 ]
})
其内容如下:项目Q与项目R相关,项目R与项目p相关,因此项目Q与项目p相关(与A、B和C相同)。在这种情况下,关系的传递性导致构建两组项

  • 每个项目只属于一个组
  • 在真实案例文件中,预期组最多可以容纳11个项目
  • 字母顺序不起作用

多亏了stackoverflow上的其他贡献,我成功地将所有可传递项分组到单个集合中,并为它们分配一个组号(或ID)。这意味着我得到的数据帧如下所示:

df1 = pd.DataFrame({
"items": [{'Q', 'R', 'P'}, {'B', 'A', 'C'} ],
"group": [1, 2]
})

以上结果现在将进行转换,以支持进一步的数据后处理,预期结果如下所示:

df2:所需输出

df0 = pd.DataFrame({
"item 1": ['Q', 'R', 'B', 'A'],
"item 2": ['R', 'P', 'A', 'C']
})
df2 = pd.DataFrame({
"items": ['Q', 'R', 'P', 'B', 'A', 'C' ],
"group": [1, 1, 1, 2, 2, 2 ]
})
==============

到目前为止我做了什么 步骤1:将df1.item转换为一系列单个项

d = df1.item
e = list(sorted(set(chain.from_iterable(d))))
df2 = pd.DataFrame({'item':e})
步骤2:通过df1.items将“vlookup”df2.items返回到df1.group

df2['group'] = ''  

n = 0
for row in df2.items :
m = 0
for row in df1.items :
    if df2['items'][n] in df1['items'][m]:
        df2['group'][n] = df1['group'][m]
    m = m + 1
n = n + 1
==============

它确实适用于小表,但不适用于大数据帧。

我现在正在寻求以下方面的帮助:

  • 为步骤2提供更好的代码以增强df2(首选)
  • 或者更好的方法跳过步骤2,直接从df1中获得df2

提前感谢您的时间和反馈

IIUC,你可以看看图书馆

您可以直接从中创建无向网络图,并使用该方法提取子组:

import networkx as nx

df0 = pd.DataFrame({'item 1': {0: 'Q', 1: 'R', 2: 'B', 3: 'A'},
                    'item 2': {0: 'R', 1: 'P', 2: 'A', 3: 'C'}})

g = nx.convert_matrix.from_pandas_edgelist(df0, source='item 1', target='item 2')
使用列表理解为新的
DataFrame

subgroups = [(n, i + 1) for i, sg in enumerate(nx.connected_component_subgraphs(g)) for n in sg.nodes]

df2 = pd.DataFrame(subgroups, columns=['items', 'subgroup'])
print(df2)

  items  subgroup
0     P         1
1     R         1
2     Q         1
3     C         2
4     A         2
5     B         2

1)
R
B
相关吗?2) 为什么要使用数据帧?1)根据df0,R与B无关。否则,我们只有一个组。2) 我没有任何不使用数据帧的限制,我对替代方案持开放态度。太棒了,我刚刚用~400k行文件在Jupyter中进行了测试,它工作得非常好!多谢各位@爱奥尼亚很乐意帮忙:)