我需要找到每个组的第一行并设置一个值。然后我需要根据上一行的值来计算其余行。我知道堆栈溢出中也有类似的答案,但我仍然找不到真正的解决方案。
这是我到目前为止尝试过的:
import numpy as np
import pandas as pd
d={'type':['a','b','a','b','a','b','a','b','a','b','a','b']}
test=pd.DataFrame(data=d)
test = test.groupby('type')
for group,df in test:
# print(group,df)
df.loc[0,'value']=800
for i in range(1,len(df)):
df.loc[i,'value']=df.loc[i-1,'value']*0.5
但是,这并没有返回我想要的。
type value
a 800
a 400
a 200
a 100
a 50
b 800
b 400
b 200
b 100
b 50
答案 0 :(得分:3)
使用自定义功能和iloc
可以通过位置而不是通过索引标签进行选择和设置:
def func(group):
group.loc[group.index[0],'value']=800
pos = group.columns.get_loc('value')
for i in range(1,len(group)):
group.iloc[i,pos]=group.iloc[i-1,pos]*0.5
return group
test1 = test.sort_values('type').groupby('type').apply(func)
print (test1)
type value
0 a 800.0
2 a 400.0
4 a 200.0
6 a 100.0
8 a 50.0
10 a 25.0
1 b 800.0
3 b 400.0
5 b 200.0
7 b 100.0
9 b 50.0
11 b 25.0
答案 1 :(得分:2)
您可以在groupby
之后使用cumprod
,因为您总是将前一个值乘以0.5,然后进行一些调整以获得正确的结果,例如:
d={'type':['a','b','a','b','a','b','a','b','a','b','a','b']}
test=pd.DataFrame(data=d)
test['value'] = test.assign(value=0.5).groupby('type').cumprod()*800*2
print (test)
type value
0 a 800.0
1 b 800.0
2 a 400.0
3 b 400.0
4 a 200.0
5 b 200.0
6 a 100.0
7 b 100.0
8 a 50.0
9 b 50.0
10 a 25.0
11 b 25.0
编辑:由于@piRSquared的想法,您还可以将每个组使用cumcount
作为0.5的幂乘以第一个值800:
test['value'] = 800 * .5 ** test.groupby('type').cumcount()
得出与上面相同的结果