如何使用一个数据帧列中的值更改来计算另一个数据帧列

How to use changes in values in one dataframe column to calculate another

提问人:AndysPythonStuff 提问时间:3/28/2023 最后编辑:AndysPythonStuff 更新时间:3/29/2023 访问量:116

问:

假设我有一个数据帧。 第一列是正数,称之为 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 列进行编码的最佳方法是什么?

谢谢

Python Pandas 数据帧 百分比 计算列

评论

1赞 rpanai 3/28/2023
嗨,欢迎来到SO。如果你能看一下如何提问,然后尝试制作一个最小的可重复的例子,那就太好了。特别是你的问题太冗长了

答:

2赞 inquirer 3/29/2023 #1

制作了一个列,你可以通过它来获取它,我将列的值与其移位值进行了比较。转化 键入 int,给出 1,其中 True。然后计算了 .'cs'group.'MORELESS'cumulative sum

在我获取下一行之后的分组时使用切片。在我得到 ferst 行的索引与前一个splitindexwhere '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
好的,会的。仍在学习如何使用该网站。