python - 如何将相关子列表的唯一ID分配给共享评论元素的子列表的每个元素?

标签 python pandas performance networkx subgraph

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

我需要一些帮助才能以智能且有效的方式获得结果(即 pythonic)

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

我想做什么

输入文件 df0 转换为所需输出 df2

例如,起始文件如下所示(但有 500k 条目),其中 item1 到 item2 的关系由数据帧的结构确定。

df0:输入

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

内容如下:项目 Q 与项目 R 相关,项目 R 与项目 P 相关,因此项目 Q 与项目 P 相关(与 A、B 和 C 相同)。在这种情况下,关系的传递性导致构建两组项目。

  • 每个项目仅属于 1 个组。
  • 在实际案例文件中,预计组最多可以容纳 11 个项目。
  • 字母顺序不起作用

感谢 stackoverflow 上的其他贡献,我成功地将所有传递项分组为单个集合,并为它们分配一个组号(或 ID)。这意味着我得到一个看起来像这样的数据框:

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

上面的结果现在将被转换以支持进一步的数据后处理,期望的结果应该如下所示:

df2:所需输出

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,您可以尝试查看 networkx图书馆。

您可以直接从 pandas.DataFrame 创建一个非直接网络图并使用 connected_component_subgraphs提取子组的方法:

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

关于python - 如何将相关子列表的唯一ID分配给共享评论元素的子列表的每个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55511992/

相关文章:

python - 在同一类中的不同方法创建的对象上调用类中的方法?

python - 子样本丰度数据框

Android:尝试设置到 ImageView 时联系人照片像素化

javascript - Firefox 是如何优化这个循环的?

python - 欧拉问题21,为什么我的解中有多余的数字?

python - 使用 groupby() 根据条件对实例进行计数

python - 索引错误 : string index out of range -

python - Pandas:根据条件将数据框中的值复制到多行

python - Pandas DataFrame 高效的数据移动

.NET - 什么是 GC 更快 : few large objects or many small objects?