请在以下位置查找我的数据帧:

df = pd.DataFrame({'class': ['class_b', 'class_a', 'class_c', 'class_d'], 'sub_class': ['class_d', None, 'class_e', 'class_a'], 'entities': [5, 1, 7, 6]})
print(df)

     class sub_class  entities
0  class_b   class_d         5
1  class_a      None         1
2  class_c   class_e         7
3  class_d   class_a         6

根据标题,我只是试图像我们在os.walk中所做的那样寻找子类,但我无法弄清楚.例如,class_bclass_d个子类,这个子类也有一个子类(class_a),我们有时可以有多达5个子级别.

我的预期输出是:

     class        all_subclass  sum_entites
0  class_a                  []            1
1  class_b  [class_d, class_a]           12
2  class_c           [class_e]            7
3  class_d           [class_a]            7
4  class_e                  []            0

我在下面犯了一个错误的代码.我想做一个while圈的循环,让Mergin保持下go ,直到没有对手,但感觉不太好.

df1 = df.merge(df, left_on='sub_class', right_on='class', how="left", indicator=True).filter(like='class')

result = df1.groupby('class_x').apply(lambda x: list(x.dropna().T.values.tolist())).to_dict()

result

{'class_a': [[], [], [], []],
 'class_b': [['class_b'], ['class_d'], ['class_d'], ['class_a']],
 'class_c': [[], [], [], []],
 'class_d': [[], [], [], []]}

伙计们,你们有什么建议吗?

推荐答案

这可以作为一个使用networkx的图问题来解决:

import networkx as nx

# build Series to later map values
# using groupby.sum in case of duplicates
s = df.groupby('class')['entities'].sum()

# create directed graph
G = nx.from_pandas_edgelist(df.fillna('NONE'), create_using=nx.DiGraph,
                            source='class', target='sub_class')
G.remove_node('NONE')

# for each node, get all descendants and sum the entities
out = pd.DataFrame([(n, (d:=nx.descendants(G, n)),
                    sum(s.get(x, 0) for x in d|{n}))
                    for n in G],
                  columns=['class', 'all_subclass', 'sum_entites'])

输出:

     class        all_subclass  sum_entites
0  class_b  {class_a, class_d}           12
1  class_d           {class_a}            7
2  class_a                  {}            1
3  class_c           {class_e}            7
4  class_e                  {}            0

图表:

enter image description here

Python相关问答推荐

有没有办法清除气流中的僵尸

日程优化问题不知道更好的方式来呈现解决方案- Python / Gekko

单击Python中的复选框后抓取数据

如何在Python中增量更新DF

更改Seaborn条形图中的x轴日期时间限制

是pandas.DataFrame使用方法查询后仍然排序吗?

如何让我的Tkinter应用程序适合整个窗口,无论大小如何?

根据给定日期的状态过滤查询集

Python多处理:当我在一个巨大的pandas数据框架上启动许多进程时,程序就会陷入困境

按列分区,按另一列排序

聚合具有重复元素的Python字典列表,并添加具有重复元素数量的新键

' osmnx.shortest_track '返回有效源 node 和目标 node 的'无'

NP.round解算数据后NP.unique

梯度下降:简化要素集的运行时间比原始要素集长

在vscode上使用Python虚拟环境时((env))

删除marplotlib条形图上的底边

与命令行相比,相同的Python代码在Companyter Notebook中运行速度慢20倍

Python Tkinter为特定样式调整所有ttkbootstrap或ttk Button填充的大小,适用于所有主题

在输入行运行时停止代码

如何获取Python synsets列表的第一个内容?