【发布时间】:2021-06-17 13:02:47
【问题描述】:
我有一个如下的数据框:
def addJump(s):
return s+'-'+s.shift(-1)
newDF = pd.DataFrame({
'Group': ['A','A','B','C','B','B','A','C','C','A','D','D'],
'Value': [1 , 3 , 5 , 10, 3 , 4 , 12, 11, 5 , 6 , 8 , 9 ],
'Extra': [0 , 7 , 0 , 3 , 0 , 0 , 1 , 0 , 2 , 5 , 0 , 0 ]
}, index= [ 0 , 0 , 0 , 1 , 1 , 1 , 2 , 2 , 3 , 3 , 3 , 4])
newDF['Jump'] = newDF.groupby(level=0)['Group'].transform(addJump)
newDF
Group Value Extra Jump
0 A 1 0 A-A
0 A 3 7 A-B
0 B 5 0 NaN
1 C 10 3 C-B
1 B 3 0 B-B
1 B 4 0 NaN
2 A 12 1 A-C
2 C 11 0 NaN
3 C 5 2 C-A
3 A 6 5 A-D
3 D 8 0 NaN
4 D 9 0 NaN
我需要在同一个index 中找到组更改的位置,并将下一个Group 第一次出现的Value 更新为前一个Group 的最后一个Value。例如,如果我们查看索引 0,则第 3 行中的 Value 应更新为 Value[row 2] + Extra[row 2]=10 ,更新将如下所示。
Group Value Extra Jump
0 A 1 0 A-A
0 A 3 7 A-B
0 B 10 0 NaN
最终结果如下:
Group Value Extra Jump
0 A 1 0 A-A
0 A 3 7 A-B
0 B 10 0 NaN
1 C 10 3 C-B
1 B 13 0 B-B
1 B 4 0 NaN
2 A 12 1 A-C
2 C 12 0 NaN
3 C 5 2 C-A
3 A 7 5 A-D
3 D 12 0 NaN
4 D 9 0 NaN
我可以使用groupby(level=0) 单独处理每个索引组,就像使用 addJump 函数一样。但是,我需要再次 groupby('Group') 并应用下一个函数,在该函数中我调用第一个 Group 中的最后一个并将其分配给第二个 Group 中的第一个。而这正是我挣扎的地方。
【问题讨论】:
-
你的数据是有序的,所有相同的索引都在跟随吗?
-
是的,它们已订购
-
for index =3 group D,上一行(index=3, group=A)的原始值给出6+5=11,但是你说的结果是12,是不是因为值在您编写 12 的操作之后,行的新值 (index=3, group=A) 变为 7?
-
是的,正如您所说。新值为 7,因此更新后的值为 12
标签: python-3.x pandas dataframe pandas-groupby