我有以下熊猫DataFrame:
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列的过去(在此特定日期之前)值进行求和来实现的。
会有什么帮助!
由于您只有3000行,并且很难对这些操作进行矢量化处理,因此可以使用循环。
#initiate varaibles
res_col2 = []
res_col0 = []
s = 0 # same date result sum
# initiate values
mult = df.iloc[0,0]
idx0 = df.index[0]
# loop with iteritems, not too bad with 3000 rows
for idx, val in (df[1]-1).iteritems(): #note the -1 is here already
# update the mult and idx0 in case of not same date
if idx != idx0:
mult += s
idx0 = idx
s = 0
# calculate the result
r = mult*val
s += r
res_col2.append(r)
res_col0.append(mult)
df[0] = res_col0
df[2] = res_col2
你会得到:
print(df)
0 1 2
2017-12-30 100.00000 1.03 3.000000
2017-12-30 100.00000 1.02 2.000000
2017-12-31 105.00000 0.97 -3.150000
2018-01-01 101.85000 1.02 2.037000
2018-01-01 101.85000 0.92 -8.148000
2018-01-02 95.73900 1.08 7.659120
2018-01-02 95.73900 1.03 2.872170
2018-01-02 95.73900 1.02 1.914780
2018-01-03 108.18507 1.03 3.245552
2018-01-03 108.18507 0.98 -2.163701
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句