我有一个数据帧,其中包含帖子和 comments . 每条 comments 都有一个id和一个父id(标识 comments 所回复的 comments 或帖子). 帖子只有一个ID,因为它们不回应任何事情.

submission id parent id
post1 1
comment1 2 1
comment2 3 1
comment3 4 2
comment4 5 4
post2 6
comment5 7 6

我想 for each comments 检索原始帖子的ID,并获得类似以下内容:

submission id parent id ancestor id
post1 1
comment1 2 1 1
comment2 3 1 1
comment3 4 2 1
comment4 5 4 1
post2 6
comment5 7 6 2

为此,我try 从dataframe的末尾循环到开头,反复回溯parent_id的parent_id,直到我发现一个空的parent_id单元格. 在测试数据帧上,它可以工作,但在主数据帧上太慢.有没有办法让它更有效率?

以下是我的原始代码:

#creating a column for the id of the original post
df["ancestor"] = df.id
#obtaining the id of the original post for every comment
for i in reversed(range(len(df.id))): #looping trough the comments
  id = df["parent_id"][i] #variable to initialize the future loop
  parent = id
  while parent != "": #only looping trough comments
    df.ancestor[i] = id
    parent = df.parent_id[df.id == id].values[0]
    id = parent

推荐答案

我不确定这是否会加快速度,但使用NetworkX库可能值得一试:

import networkx as nx

G = nx.from_pandas_edgelist(
    df[df["parent_id"].ne("")], source="parent_id", target="id"
)

roots = set(df.loc[df["parent_id"].eq(""), "id"])
mapping = {}
for comp in nx.connected_components(G):
    root = (roots & comp).pop()
    roots.discard(root)
    mapping.update(dict.fromkeys(comp - {root}, root))

df["ancestor_id"] = df["id"].map(mapping)
  • 首先将parent_id-id组合读取为图G中的边.
  • 确定树的根 node roots(根据我的理解,G应该是Forrest).
  • 然后构建mapping个 node 的根(通过G的组件),并将其应用于列id.

本例的结果:

  submission id parent_id ancestor_id
0      post1  1                   NaN
1   comment1  2         1           1
2   comment2  3         1           1
3   comment3  4         2           1
4   comment4  5         4           1
5      post2  6                   NaN
6   comment5  7         6           6

Python相关问答推荐

重置PD帧中的值

巨 Python :逆向猜谜游戏

如何按row_id/row_number过滤数据帧

为什么dict. items()可以快速查找?

为什么后跟inplace方法的`.rename(Columns={';b';:';b';},Copy=False)`没有更新原始数据帧?

Python OPCUA,modbus通信代码运行3小时后出现RuntimeError

用来自另一个数据框的列特定标量划分Polars数据框中的每一列,

有什么方法可以在不对多索引DataFrame的列进行排序的情况下避免词法排序警告吗?

根据边界点的属性将图划分为子图

从`end_date`回溯,如何计算以极为单位的滚动统计量?

Django/Python-UpdateView中的Delete函数正在复制,而不是删除

如何使一个更有效的映射函数基于一个以另一个嵌套框架的索引和列名作为其数据集的嵌套框架?

Windows与pwd.getpwuid有什么类似功能?

在Pandas 中通过GroupBy操作创建新列时出现KeyError

使用GEKKO将两个总体拟合到测量值如何优化第一个数据点

在重复时更新给定条件下的数据框行

在记录器模块中设置两个不同的调试级别

Django URL中不需要的空格

是否 Select 所有整型列,除了几个python-polars列?

Python .删除DataFrame中的标题标签(&U;UNNAMED:0),并将其余标题标签向左移动(不更改值)