通行函数进入熊猫集团

问题描述 投票:0回答:1

我通过搜索并在堆栈溢出中提出另一个问题来计算我需要的某个值:

def my_function(df):
    df['Expected'] = 0
    for i in range(1, len(df)):
        if df['Units'][i] == 0:
            df['Expected'][i] = df['Expected'][i-1]
        if df['Units'][i] > 0:
            df['Expected'][i] = ((df['Units'][i]-2*df['Expected'][i-1])//5).clip(0) + df['Expected'][i-1].cumsum()

,但是,如何适应此功能,以便它可以在不同的组上为我的数据工作。目前,我的功能只有一次通过一组才能准确。我尝试了几种不同的方法,包括“ _ for _ for _ group_key组:”,但我似乎无法使该功能适用于我的数据所拥有的每个组。 我的预期输出应该是:

Type    Date    Value  Expected
A       Jun-21  0      0
A       Jul-21  0      0
A       Aug-21  0      0
A       Sep-21  0      0
A       Oct-21  10     2
A       Nov-21  0      2
A       Dec-21  20     5
A       Jan-22  0      5
A       Feb-22  0      5
A       Mar-22  7      5
A       Apr-22  12     5
A       May-22  35     10
A       Jun-22  0      10
B       Jun-21  0      0
B       Jul-21  0      0
B       Aug-21  0      0
B       Sep-21  0      0
B       Oct-21  7      1
B       Nov-21  4      1
B       Dec-21  0      1
B       Jan-22  4      1
B       Feb-22  9      2
B       Mar-22  5      2
B       Apr-22  8      2
B       May-22  3      2
B       Jun-22  11     3 

它可以很好地将每个组分别传递到该功能,但是只是想知道将其用于一次对每个组工作的最佳方法是什么。任何帮助都非常感谢!

通过
type

进行分组,并申请

my_function()
python pandas function group-by apply
1个回答
1
投票
range(len(df))

def my_function(d):
    # initialize with 0
    d['Expected'] = 0
    # iterate over the index
    for i in d.index[1:]:
        if d.loc[i, 'Units'] == 0:
            d.loc[i, 'Expected'] = d.loc[i-1, 'Expected']
        elif d.loc[i, 'Units'] > 0:
            d.loc[i, 'Expected'] = d.loc[i-1, 'Expected'] + (d.loc[i, 'Units'] - 2 * d.loc[i-1, 'Expected']).clip(0)//5
    return d

# apply the function by types
df = df.groupby('type').apply(my_function)
df
,因为该程序需要在不同的组中运行。
my_function()


我还通过使用.locenter image description here而不是[][]

去除不必要的

cumsum()

df['Expected'][i-1].cumsum()
是一个值,所以
cumsum()
 //
)添加后(因为有
clip(0)
,函数不会更改),以摆脱一层额外的括号。
	
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.