首页 > 解决方案 > 按组将每一行减少前一行的百分比

问题描述

我的数据如下所示:

季节 播放器 分钟
1 K.布莱恩特 700
2 K.布莱恩特 700
3 K.布莱恩特 700
4 K.布莱恩特 700
1 P.皮尔斯 750
2 P.皮尔斯 750
3 P.皮尔斯 750

我想将每个赛季的分钟数减少上一赛季的 10%。每个玩家的行数都不相同。我想要以下内容:

季节 播放器 分钟
1 K.布莱恩特 700
2 K.布莱恩特 630
3 K.布莱恩特 567
4 K.布莱恩特 510
1 P.皮尔斯 750
2 P.皮尔斯 675
3 P.皮尔斯 608

有任何想法吗?提前致谢

标签: pythonpandasdataframe

解决方案


尝试使用groupby cumprod创建一系列保留百分比

pct = .1
# Create a column with keep percentage as 1 - .1
df['keep_pct'] = (1 - pct)
# Groupby for player and keep_pct
g = df.groupby('player')['keep_pct']

# Shift to prevent affecting the first row of each group
# fill_value with 1 so first row is 100%
df['keep_pct'] = g.shift(fill_value=1)

# Cumprod to compound the keep percentage
df['keep_pct'] = g.cumprod()

# Multiply minutes and keep_pct columns
df['minutes'] = df['minutes'].mul(df['keep_pct']).round(0).astype(int)

# Cleanup Columns
df = df.drop(columns='keep_pct')

df

   season     player  minutes
0       1  K. Bryant      700
1       2  K. Bryant      630
2       3  K. Bryant      567
3       4  K. Bryant      510
4       1  P. Pierce      750
5       2  P. Pierce      675
6       3  P. Pierce      608

df['keep_pct']

0    1.000
1    0.900
2    0.810
3    0.729
4    1.000
5    0.900
6    0.810
Name: keep_pct, dtype: float64

推荐阅读