python - 将前一行两列的乘积附加到下一行
问题描述
我有以下熊猫数据框:
import pandas as pd
df = pd.DataFrame([[1, 100, 1.1],
[2, float('NaN'), 0.97],
[3, float('NaN'), 1.1],
[4, float('NaN'), 1.2],
[5, float('NaN'), 1]], columns=['day', 'Amount', 'Rate'])
df
╔═════╦═════════╦══════╗
║ day ║ Amount ║ Rate ║
╠═════╬═════════╬══════╣
║ 1 ║ 100 ║ 1.1 ║
║ 2 ║ NaN ║ 0.97 ║
║ 3 ║ NaN ║ 1.1 ║
║ 4 ║ NaN ║ 1.2 ║
║ 5 ║ NaN ║ 1.0 ║
╚═════╩═════════╩══════╝
我需要 day+1 Amount = day-1 Amount * day-1 Rate。所以输出应该是:
╔═════╦═════════╦══════╗
║ day ║ Amount ║ Rate ║
╠═════╬═════════╬══════╣
║ 1 ║ 100 ║ 1.1 ║
║ 2 ║ 110 ║ 0.97 ║
║ 3 ║ 106.7 ║ 1.1 ║
║ 4 ║ 117.37 ║ 1.2 ║
║ 5 ║ 140.844 ║ 1.0 ║
╚═════╩═════════╩══════╝
有没有什么熊猫方法可以实现这一点?因为我是用循环来做的,我觉得它效率不高。
解决方案
使用Series.shift
withSeries.cumprod
和 multiple by 100
,最后替换Amount
列中的缺失值:
df['Amount'] = df['Amount'].fillna(df['Rate'].shift().cumprod().mul(100))
print (df)
day Amount Rate
0 1 100.000 1.10
1 2 110.000 0.97
2 3 106.700 1.10
3 4 117.370 1.20
4 5 140.844 1.00
如果想使用Amount
列的第一个值:
first = df.loc[0, 'Amount']
df['Amount'] = df['Rate'].shift().cumprod().mul(first).fillna(first)
print (df)
day Amount Rate
0 1 100.000 1.10
1 2 110.000 0.97
2 3 106.700 1.10
3 4 117.370 1.20
4 5 140.844 1.00
推荐阅读
- windows - 卸载 VS Code 会删除我的设置吗?
- c# - 使用存储在同一目录中的多个 exe 文件的软件应该如何处理
- go - 在循环中清除和重写切片
- powershell - Powershell get-server - 排除列表中的那些
- reactjs - 基于 redux/react 的容器的可重用性
- vba - Range.End 空白 VBA
- git - 如何在 vs code 中设置 Team Foundation Server 存储库?
- typescript - 错误类型没有编译错误
- sql - 不以元音开头,也不以元音结尾
- perl - 带有输入块的 awk / perl 调用命令