我有一个字典,其中包含keys = parents和values = children:
dictionary = {'100': '120', '200': '149', '760': '800', '800': '790', '150': '700', '59': '80'}
和pandas数据帧
nodes figures numbers
100 triangle 0.8
120 triangle 0.2
200 square 0.3
149 square 0.2
59 square 0.9
760 circle 0.13
800 circle 0.13
790 circle 0.13
150 circle 0.13
对于图中的每个项目,对于每个节点,如果任何节点是另一个节点的父节点,我想分配数字值的总和,如下所示
nodes figures numbers
100 triangle 1
120 triangle 0.2
200 square 0.5
149 square 0.2
59 square 0.9
760 circle 0.39
800 circle 0.26
790 circle 0.13
150 circle 0.13
我试过了 out = groupby([“数字”])['数字']。总和()
但它没有返回正确的输出
figures numbers
triangle 1
square 1.4
circle 0.52
答案 0 :(得分:2)
您可以使用迭代数据框中每一行的函数来执行此操作,并递归搜索子行,并随时添加值。
def get_children_values(row):
if str(row.nodes) in dictionary: # searches for a child row
child = df[(df.figures == row.figures) & (df.nodes.astype(str) == dictionary[str(row.nodes)])]
if not child.empty: # if a child row is found, add its numbers value
return row.numbers + get_children_values(child.iloc[0])
return row.numbers # if no child is found just return the numbers value for this row
让我们将其输出分配给新列进行比较:
df['new_numbers'] = df.apply(get_children_values, axis = 1)
print(df)
nodes figures numbers new_numbers
0 100 triangle 0.80 1.00
1 120 triangle 0.20 0.20
2 200 square 0.30 0.50
3 149 square 0.20 0.20
4 59 square 0.90 0.90
5 760 circle 0.13 0.39
6 800 circle 0.13 0.26
7 790 circle 0.13 0.13
8 150 circle 0.13 0.13
这适用于任何深度的树,但是如果树中存在循环,则会因递归深度错误而失败。