我將創建一個工作數據集d1
併爲其分配一些新列。
iszero
跟蹤其中prob
爲零。稍後我會乘以此列
novist
跟蹤我們visit
不是零的軌道。稍後我將乘以此值並用它來幫助創建組
filled_prob
填充1
其中prob
爲零。這有助於使我的prod
函數稍後運行良好。
d1 = df.assign(
iszero=df.prob.eq(0),
novisit=df.visit.ne(0),
filled_prob=np.where(df.prob.eq(0), 1, df.prob)
)
d1
我會用我剛剛創建創建一個分組列
d1['visit_group'] = d1.groupby(['product', 'store']).novisit.cumsum()
d1
最後一列,加'cum_prob'
與我在上面製作的列。
d1['cum_prob'] = d1.groupby(
['product', 'store', 'visit_group']
).filled_prob.transform('prod') * (~d1.iszero) * (~d1.novisit)
d1
你可以切它爲您的目的
d1.loc[:, df.columns.tolist() + ['cum_prob']]
一起
d1 = df.assign(
iszero=df.prob.eq(0),
novisit=df.visit.ne(0),
filled_prob=np.where(df.prob.eq(0), 1, df.prob)
)
d1['visit_group'] = d1.groupby(['product', 'store']).novisit.cumsum()
d1['cum_prob'] = d1.groupby(
['product', 'store', 'visit_group']
).filled_prob.transform('prod') * (~d1.iszero) * (~d1.novisit)
d1.loc[:, df.columns.tolist() + ['cum_prob']]
迴應置評:周跳
是否不改變的計算,因爲我已經奠定了。相反,我們可以預先篩選df
這樣
def skip_weeks(x):
"""check if difference in week from one row
to the next is always 1. If not, then we skipped a week"""
return x.week.diff().dropna().eq(1).all()
# I'll use this to map and filter in a bit
no_skips = df.groupby(['product', 'store']).apply(skip_weeks)
# produces
# product store
# 123 301 True
# 321 True
# dtype: bool
# simple series of tuples
# could've done `df[['product', 'store']].apply(tuple, 1)`
# but this is quicker
s = pd.Series(list(zip(df['product'].tolist(), df.store.tolist())), df.index)
# filter, this is what we then use rest of algorithm on
# remember to assign it to a variable like `df = df.loc[s.map(no_skips)]`
df.loc[s.map(no_skips)]
非常感謝,你能否解釋第二個最後一步。變換部分 – Mukul
[transform](http://pandas.pydata.org/pandas-docs/stable/groupby.html#transformation)返回一個對象,該對象的相同索引傳遞給groupby組中的'groupby'複製值。 – piRSquared
我真的不喜歡這個答案。非常複雜,難以遵循。 –