- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个包含父 ID 和子 ID 的 Pandas 数据框。我需要帮助构建一个更新的数据框,列出每个 parent 的每个后代。
为了阐明输出应该是什么样子,这里有一篇关于 dba.stackexchange 的帖子使用 SQL 来完成我在 python 中尝试做的事情。
这是输入 DataFrame 的示例:
parent_id child_id
0 3111 4321
1 2010 3102
2 3000 4023
3 1000 2010
4 4023 5321
5 3011 4200
6 3033 4113
7 5010 6525
8 3011 4010
9 3102 4001
10 2010 3011
11 4023 5010
12 2110 3000
13 2100 3033
14 1000 2110
15 5010 6100
16 2110 3111
17 1000 2100
18 5010 6016
19 3033 4311
下面是硬编码为 DataFrame 的实际示例数据
df = pd.DataFrame(
{
'parent_id': [3111, 2010, 3000, 1000, 4023, 3011, 3033, 5010, 3011, 3102, 2010, 4023, 2110, 2100, 1000, 5010, 2110, 1000, 5010, 3033],
'child_id': [4321, 3102, 4023, 2010, 5321, 4200, 4113, 6525, 4010, 4001, 3011, 5010, 3000, 3033, 2110, 6100, 3111, 2100, 6016, 4311]
}
)
这是我尝试使用递归列表构建策略
parent_list = []
def recurse(parent, child, root_parent):
# initialize on first run of each branch
if root_parent is None:
root_parent = parent
parent_list.append((parent, child))
recurse(parent, child, root_parent)
# for each parent find every child recursively
for index, row in df.iterrows():
if row['parent_id'] is child:
parent_list.append((root_parent, row['child_id']))
recurse(row['parent_id'], row['child_id'], root_parent)
# recurse down each parent branch
for i, r in df.iterrows():
recurse(r['parent_id'], r['child_id'], None)
return parent_list
...目前只是复制数据,因为我没有正确遍历树。
输出格式应遵循输入格式。我想要一个包含父 ID 和子 ID 的两列表,如以下示例输出所示。
这是上述数据的预期输出:
parent_id child_id
0 1000 2010
1 1000 2100
2 1000 2110
3 1000 3000
4 1000 3011
5 1000 3033
6 1000 3102
7 1000 3111
8 1000 4001
9 1000 4010
10 1000 4023
11 1000 4113
12 1000 4200
13 1000 4311
14 1000 4321
15 1000 5010
16 1000 5321
17 1000 6016
18 1000 6100
19 1000 6525
20 2010 3011
21 2010 3102
22 2010 4001
23 2010 4010
24 2010 4200
25 2100 3033
26 2100 4113
27 2100 4311
28 2110 3000
29 2110 3111
30 2110 4023
31 2110 4321
32 2110 5010
33 2110 5321
34 2110 6016
35 2110 6100
36 2110 6525
37 3000 4023
38 3000 5010
39 3000 5321
40 3000 6016
41 3000 6100
42 3000 6525
43 3011 4010
44 3011 4200
45 3033 4113
46 3033 4311
47 3102 4001
48 3111 4321
49 4023 5010
50 4023 5321
51 4023 6016
52 4023 6100
53 4023 6525
54 5010 6016
55 5010 6100
56 5010 6525
为每一行添加从 parent_id
到 child_id
的额外深度/距离列的奖励积分。时间差
最佳答案
这应该返回您想要的两列中的父 ID 和子 ID:
import pandas as pd
import numpy as np
import itertools
df = pd.DataFrame(
{
'parent_id': [3111, 2010, 3000, 1000, 4023, 3011, 3033, 5010, 3011, 3102, 2010, 4023, 2110, 2100, 1000, 5010, 2110, 1000, 5010, 3033],
'child_id': [4321, 3102, 4023, 2010, 5321, 4200, 4113, 6525, 4010, 4001, 3011, 5010, 3000, 3033, 2110, 6100, 3111, 2100, 6016, 4311]
}
)
def get_child_list(df, parent_id):
list_of_children = []
list_of_children.append(df[df['parent_id'] == parent_id]['child_id'].values)
for i_, r_ in df[df['parent_id'] == parent_id].iterrows():
if r_['child_id'] != parent_id:
list_of_children.append(get_child_list(df, r_['child_id']))
# to flatten the list
list_of_children = [item for sublist in list_of_children for item in sublist]
return list_of_children
new_df = pd.DataFrame(columns=['parent_id', 'list_of_children'])
for index, row in df.iterrows():
temp_df = pd.DataFrame(columns=['parent_id', 'list_of_children'])
temp_df['list_of_children'] = pd.Series(get_child_list(df, row['parent_id']))
temp_df['parent_id'] = row['parent_id']
new_df = new_df.append(temp_df)
print new_df
关于python - 从 Pandas 数据框父子表中获取父项的所有后代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46521390/
我有一个表(id, parent_id, data),其中parent_id 指向同一表中的另一行(或者为空)。 是否有一种标准的方法来查询(1)某个 id 的所有祖先和(2)某个 id 的所有后代?
networkx 中是否有函数/方法来识别给定(可选加权)距离内的所有祖先/后代? 例如,可以有效地产生与下面的函数相同的结果的东西? import networkx g = networkx.DiG
在我的窗口事件中,如果指针点击父对象或其子对象/后代对象,它应该做一些事情。问题是事件无法访问 parent 的 child 和孙子。条件存储在 targetIsInsideParent 变量中。 H
我有一个非常好的 DirectMySQL 单元,可以使用,我希望它成为 TDataset 的后代,这样我就可以将它与 QuickReport 一起使用,我只想要使用来自 TDataset 的 Dire
我将 mysql 表定义为: 类别:category_id、category_name、parent_category_id 我正在寻找一个很好的 sql 查询来检索给定 category_id 的所
我的 TCustomControl 后代使用线程,这涉及使用 InvalidateRect 进行无效化。我遇到这样的情况:当线程正在工作时关闭程序时,我不会停止 Destroy 中的线程,因为即使在进
我的 TMemo 后代有构造函数 constructor TMyMemo.Create(AOwner: TComponent); begin inherited Create(AOwner);
我正在尝试创建一个像Delphi 2009的TButtonedEdit这样的组件。它是一个自定义的TEdit,左右各有2个按钮。 在我的版本中,我使用 2 个 TSpeedButton 对象作为左右按
我遇到了一些问题,看起来使用 JQuery 应该很容易做到。基本上我的页面上有一个表格。表格中的每一行都有一个复选框和一个金额单元格。我正在尝试编写一个函数来遍历每一行并检查复选框是否已选中。如果是这
如何使用 linq 对包含相同对象的子集合 X 层深的对象集合获得与 doc.Descendants() 类似的功能? 最后一个嵌套集合包含需要获取的数据,所有其他父集合只是分组。我可以将集合转换为
我有一个引用自身的表,如下所示: CREATE TABLE Foo ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, parent INT NULL, nam
我正在尝试添加以下约束来对齐表格单元格内的图像。 self 指的是 ImageView 将驻留在其中的 UITableViewCell 对象: var imageViewTest = UIIm
我有以下标记: content Link Link Link
这里是一个简化的mxl结构'xml', Alice30 Bob31 Charley29 Dory25 这是我尝试过的; XmlDocument submiss
我正在尝试编写一个类,该类将在其对象创建时运行一个线程,并在对象被删除后停止该线程。 class MyThread : public boost::thread { public: MyThr
我有一个表 width: 100%以及该表中的元素 width: 40em; max-width: 100% , 但当浏览器窗口太小时,该元素仍在拉伸(stretch)表格。 我希望这个元素的宽度固定
我正在尝试在 Delphi 2007 中创建基于 TCustomComboBox 的自定义控件,但我陷入了第一个障碍。 我试图覆盖下拉列表的显示方式,主要是显示的文本,查看 stdctrls.pas
我正在尝试创建一个具有集合属性的自定义组件。但是,如果我尝试在设计时通过单击对象检查器中的“...”按钮来打开集合编辑器,则不会发生任何情况。我缺少什么? 这是我的 TCollection 后代:
我正在使用WPF DataGrid,并放置了DataGridTemplateColumn。因为该列应该对复杂类型(这是一个对象)执行编辑,所以我决定放置一个打开弹出窗口的切换按钮。代码如下:
我有一个基本的 UserControl (BaseControl.cs),上面有一个 OK 和 Cancel 按钮。单击按钮时,将触发一个事件。通常其他 UserControl 对象继承自 BaseC
我是一名优秀的程序员,十分优秀!