我有一个像这样的数据框:
ID Instance Value
-------------------------------------
52349 1 10
13523 1 15
13523 2 20
13523 3 30
12356 1 10
12356 2 15
22355 1 23
我需要让ID的第一实例的值平均到第一,第二和第三实例,并且ID的第二实例的值要平均到第二和第三实例。我正在寻找的最终结果如下:
ID Instance Value
-------------------------------------
52349 1 10
13523 1 5
13523 2 15
13523 3 45
12356 1 5
12356 2 20
22355 1 23
如果您查看ID号13523,则应按以下方式细分该值:
15 5
20 5 10
30 5 10
添加加粗的值会给出我正在寻找的值
答案 0 :(得分:0)
让我们尝试一下:
df['newValue'] = df.groupby('ID')['Value']\
.transform(lambda x: (x / (x.notnull().cumsum()[::-1].values)).cumsum())
输出:
ID Instance Value newValue
0 52349 1 10 10
1 13523 1 15 5
2 13523 2 20 15
3 13523 3 30 45
4 12356 1 10 5
5 12356 2 15 20
6 22355 1 23 23
在每个groupby
的ID组中,使用transform
创建一个新值。
首先使用notnull
和cumsum
来创建连续的值计数,然后使用[::-1]
(可逆元素)进行倒计数,将X除以来转换值x倒数并使用cumsum
来计算平均值的连续总数。