在groupby中循环,并更改每个组的第一行

时间:2019-09-04 12:44:14

标签: python pandas

我需要找到每个组的第一行并设置一个值。然后我需要根据上一行的值来计算其余行。我知道堆栈溢出中也有类似的答案,但我仍然找不到真正的解决方案。

这是我到目前为止尝试过的:

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

2 个答案:

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

得出与上面相同的结果