如果pandas按层次顺序排列,则汇总它们

时间:2017-05-21 14:41:35

标签: python pandas

我有一个字典,其中包含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

1 个答案:

答案 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

这适用于任何深度的树,但是如果树中存在循环,则会因递归深度错误而失败。