我有這個資料框(ID 是一個字串,值是一個浮點數):
ID Value
1 0.0
1.1 0.0
1.2 0.0
1.2.1 27508.42
1.2.2 25861.82
1.3 0.0
1.3.1 0.0
1.3.1.1 0.0
1.3.1.2 0.0
1.3.1.3 30396.25
誰的結構是這樣的:
1
├── 1.1
├── 1.2
│ ├── 1.2.1
│ └── 1.2.2
└── 1.3
└── 1.3.1
├── 1.3.1.1
├── 1.3.1.2
└── 1.3.1.3
并且需要“父”節點的值是葉子的總和。所以:
ID Value
1 83766.489 (1.1 1.2 1.3)
1.1 0.0
1.2 53370.24 (1.2.1 1.2.2)
1.2.1 27508.42
1.2.2 25861.82
1.3 30396.25 (1.3.1)
1.3.1 30396.25 (1.3.1.1 1.3.1.2 1.3.1.3)
1.3.1.1 0.0
1.3.1.2 0.0
1.3.1.3 30396.25
如何對 ID 進行分組?使用 groupby 將不起作用,因為所有 ID 都是唯一的。我應該更改資料框的結構以更好地反映架構的邏輯嗎?
uj5u.com熱心網友回復:
另一種解決方案(假設列ID已排序):
def counter(x):
out = []
for id_, v in zip(x.index, x):
s = sum(
v
for a, v in out
if a.startswith(id_) and id_.count(".") == a.count(".") - 1
)
out.append((id_, s v))
return [v for _, v in out]
print(df.set_index("ID")[::-1].apply(counter)[::-1].reset_index())
印刷:
ID Value
0 1 83766.49
1 1.1 0.00
2 1.2 53370.24
3 1.2.1 27508.42
4 1.2.2 25861.82
5 1.3 30396.25
6 1.3.1 30396.25
7 1.3.1.1 0.00
8 1.3.1.2 0.00
9 1.3.1.3 30396.25
uj5u.com熱心網友回復:
您可以找到構成每個 ID 的“子 ID”的 ID,然后對這些“子 ID”求和
from itertools import tee
from collections import defaultdict
d = defaultdict(list)
a, b = tee(df['ID'].values)
b = list(b)
for a_val in a:
for b_val in b:
if b_val.startswith(a_val):
d[a_val].append(b_val)
d
for b_val in b:
df.loc[df['ID'] == b_val, 'total'] = sum(df.loc[df['ID'].isin(d[b_val]), 'Value'])
print(df)
ID Value total
0 1 0.00 83766.49
1 1.1 0.00 0.00
2 1.2 0.00 53370.24
3 1.2.1 27508.42 27508.42
4 1.2.2 25861.82 25861.82
5 1.3 0.00 30396.25
6 1.3.1 0.00 30396.25
7 1.3.1.1 0.00 0.00
8 1.3.1.2 0.00 0.00
9 1.3.1.3 30396.25 30396.25
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/475463.html
