【发布时间】:2020-12-20 12:53:32
【问题描述】:
我有以下熊猫数据框:
df = pd.DataFrame([[100,100,0,0,0,0,0,0,0,0],[1.03, 1.02, 0.97, 1.02, 0.92, 1.08, 1.03 ,1.02, 1.03, 0.98],[0,0,0,0,0,0,0,0,0,0]]).T
df.index = ['2017-12-30', '2017-12-30', '2017-12-31','2018-01-01','2018-01-01',
'2018-01-02','2018-01-02','2018-01-02','2018-01-03','2018-01-03']
有输出:
0 1 2
2017-12-30 100.0 1.03 0.0
2017-12-30 100.0 1.02 0.0
2017-12-31 0.0 0.97 0.0
2018-01-01 0.0 1.02 0.0
2018-01-01 0.0 0.92 0.0
2018-01-02 0.0 1.08 0.0
2018-01-02 0.0 1.03 0.0
2018-01-02 0.0 1.02 0.0
2018-01-03 0.0 1.03 0.0
2018-01-03 0.0 0.98 0.0
但是,我想将此 DataFrame 转换为如下所示的 DataFrame:
0 1 2
2017-12-30 100.00 1.03 3.0
2017-12-30 100.00 1.02 2.0
2017-12-31 105.00 0.97 -3.15
2018-01-01 101.85 1.02 2.037
2018-01-01 101.85 0.92 -8.15
2018-01-02 95.737 1.08 7.65
2018-01-02 95.737 1.03 2.87
2018-01-02 95.737 1.02 1.91
2018-01-03 108.17 1.03 3.25
2018-01-03 108.17 0.98 -2.16
2018-01-04 109.26 np.nan np.nan
执行的计算如下: 计算最后一列的前 2 个值。
100 * (1.03-1) = 3
100 * (1.02 -1) = 2
那么第一列的第三个值将是:
100 + 3 + 2 = 105
计算最后一列第三行的值。
105 * (0.97-1) = -3.15
那么第一列中的第四个和第五个值(与日期相关)将是:
105 -3.15 = 101.85
计算最后一列的第四个和第五个值。
101.85 * (1.02-1) = 2.037
101.85 * (0.92-1) = -8.15
这个过程一直持续到所有的值都被填满为止。
Columns 2 是 column 0 乘以 column 1 - 1。 Columns 0 由 summation 的过去(时间相关)值 column 2 得出。
每一天的每一行在第 0 列都有相同的值。这是通过对第 2 列的过去(在此特定日期之前)值求和来实现的。
一切都会有帮助!
【问题讨论】:
-
我不完全理解你的公式。看起来
df[2]的值取决于df[0],但df[0]的值取决于df[1]的值。比如df[1]103的第二个值为什么不是? -
看起来像一个递归。如果您不想使用封闭形式的解决方案(如果存在),那么 for 循环就是要走的路。
-
我添加了一些 cmets 来澄清一下。 df[1] 的值不依赖于任何其他值。是的,它确实看起来像一个 for 循环。
-
你的真实数据框的大小是多少?
-
你是对的!很抱歉这个错误。
标签: python pandas group-by sum rolling-computation