我通过搜索并在堆栈溢出中提出另一个问题来计算我需要的某个值:
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()
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()
我还通过使用.loc
而不是
[][]
cumsum()
(
df['Expected'][i-1].cumsum()
是一个值,所以
cumsum()
//
)添加后(因为有clip(0)
,函数不会更改),以摆脱一层额外的括号。