python - 按组将每一行减少前一行的百分比
问题描述
我的数据如下所示:
季节 | 播放器 | 分钟 |
---|---|---|
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 |
有任何想法吗?提前致谢
解决方案
尝试使用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
推荐阅读
- python - 按属性对对象列表进行排序不会排序?
- firebase - Firebase AuthUI iOS 自定义
- ruby-on-rails - 如何使用 id 进行搜索,但在 React 的 url 链接中使用 slug
- postgresql - 如何在docker中使用flyway初始化postgres db?
- javascript - 如何将函数参数转换为键/值对?
- office365 - 订阅验证请求失败。响应必须与validationToken 查询参数完全匹配
- python - 如何找到列表中最长的列表?
- r - missing.pattern.plot 或 mp.plot 发生了什么?
- java - Binance API Java - 止损限价单?
- javascript - 添加到嵌套在关联数组javascript中的数组