首页 > 解决方案 > 将前一行两列的乘积附加到下一行

问题描述

我有以下熊猫数据框:

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  ║
╚═════╩═════════╩══════╝

有没有什么熊猫方法可以实现这一点?因为我是用循环来做的,我觉得它效率不高。

标签: pythonpandas

解决方案


使用Series.shiftwithSeries.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

推荐阅读