提问人:AndysPythonStuff 提问时间:3/28/2023 最后编辑:AndysPythonStuff 更新时间:3/29/2023 访问量:116
如何使用一个数据帧列中的值更改来计算另一个数据帧列
How to use changes in values in one dataframe column to calculate another
问:
假设我有一个数据帧。 第一列是正数,称之为 PRICE。
第二列中的值(称为 MORELESS)只能是 1 或 -1,并且根据当前行中 PRICE 的值是大于 (1) 还是小于 (-1) 上一行中 price 的值来计算的。
这部分我可以编码OK。
现在,第三列,称为CHANGE,更难。
CHANGE 不一定每行都有一个值,并且仅在 MORELESS 更改(从 1 到 -1 或 -1 到 1)时计算。它是当前行和发生 CHANGE 的最后一行之间 VALUE 的百分比变化(即 MORELESS 更改 1/-1、-1/1)。这是我在excel中手工做的一个例子:
指数 | 价格 | 更多LESS | 改变 |
---|---|---|---|
1 | 148,25 | ||
2 | 143,53 | -1 | -3,18 |
3 | 139,94 | -1 | |
4 | 139,00 | -1 | |
5 | 140,31 | 1 | -2,24 |
6 | 146,25 | 1 | |
7 | 145,81 | -1 | 3,92 |
8 | 144,59 | -1 | |
9 | 144,47 | -1 | |
10 | 146,53 | 1 | 0,49 |
11 | 145,34 | -1 | -0,81 |
12 | 145,31 | -1 | |
13 | 146,97 | 1 | 1,12 |
14 | 145,50 | -1 | -1,00 |
15 | 145,66 | 1 | 0,11 |
16 | 140,52 | -1 | -3,53 |
17 | 141,00 | 1 | 0,34 |
18 | 141,84 | 1 | |
19 | 139,44 | -1 | -1,11 |
20 | 135,81 | -1 | |
21 | 139,75 | 1 | 0,22 |
22 | 141,28 | 1 |
例子: 第 11 行中的 CHANGE 使用第 10 行中的 PRICE:100*(145.34-146.53)/146.53 第 21 行中的 CHANGE 使用第 19 行中的 PRICE:100*(139.75-139.44)/139.44
对 CHANGE 列进行编码的最佳方法是什么?
谢谢
答:
2赞
inquirer
3/29/2023
#1
制作了一个列,你可以通过它来获取它,我将列的值与其移位值进行了比较。转化
键入 int,给出 1,其中 True。然后计算了 .'cs'
group.
'MORELESS'
cumulative sum
在我获取下一行之后的分组时使用切片。在我得到 ferst 行的索引与前一个split
index
where 'cs' == 1
'aaa'
'cs'.
import pandas as pd
import numpy as np
df['cs'] = (df['MORELESS'] != df['MORELESS'].shift()).astype(int).cumsum()
split = df[df['cs'] == 1].index[-1] + 1
df['test'] = np.nan
def my_func(x):
aaa = df[df['cs'] == x['cs'].values[0] - 1].index[0]
df.loc[x.index[0], 'test'] = 100 * ((df.loc[x.index[0], 'PRICE'] - df.loc[aaa, 'PRICE']) / df.loc[aaa, 'PRICE'])
df[split:].groupby('cs').apply(my_func)
print(df)
输出
INDEX PRICE MORELESS CHANGE cs test
0 1 148.25 NaN NaN 1 NaN
1 2 143.53 -1.0 -3.18 2 -3.183811
2 3 139.94 -1.0 NaN 2 NaN
3 4 139.00 -1.0 NaN 2 NaN
4 5 140.31 1.0 -2.24 3 -2.243433
5 6 146.25 1.0 NaN 3 NaN
6 7 145.81 -1.0 3.92 4 3.919892
7 8 144.59 -1.0 NaN 4 NaN
8 9 144.47 -1.0 NaN 4 NaN
9 10 146.53 1.0 0.49 5 0.493793
10 11 145.34 -1.0 -0.81 6 -0.812120
11 12 145.31 -1.0 NaN 6 NaN
12 13 146.97 1.0 1.12 7 1.121508
13 14 145.50 -1.0 -1.00 8 -1.000204
14 15 145.66 1.0 0.11 9 0.109966
15 16 140.52 -1.0 -3.53 10 -3.528766
16 17 141.00 1.0 0.34 11 0.341588
17 18 141.84 1.0 NaN 11 NaN
18 19 139.44 -1.0 -1.11 12 -1.106383
19 20 135.81 -1.0 NaN 12 NaN
20 21 139.75 1.0 0.22 13 0.222318
21 22 141.28 1.0 NaN 13 NaN
评论
0赞
AndysPythonStuff
3/31/2023
哇。我必须详细研究一下!非常感谢您的支持!
1赞
inquirer
3/31/2023
如果您有任何问题,请询问。如果对您有帮助,您可以对答案投赞成票。
0赞
AndysPythonStuff
4/1/2023
好的,会的。仍在学习如何使用该网站。
评论