首页 > 解决方案 > 根据另一列结果(这是一个字符串)对数据框列的元素求和

问题描述

我目前有一个返回 ACTION 的数据框。根据 ACTION,它将根据 CHANGE 列中的百分比变化增加或减少 BALANCE。如果操作是 BH 或 BC,则 BALANCE 将更改 CHANGE 列中的 % BALANCE 在 B 或 SIT 天未更改 我的数据框当前的示例如下:

import pandas as pd
import numpy as np

df = pd.DataFrame()
df['ACTION'] = ('SIT','BC', 'BH', 'BH', 'BH', 'BH', 'B', 'SIT', 'SIT')
df['CHANGE'] = (0.02, -0.02, 0.17, -0.01, 0.05, -0.02, 0.02, 0.03, 0.01)


df = df[::-1]
conditions = [
    df['ACTION'].eq('BC'),
    df['ACTION'].eq('BH'),
    df['ACTION'].eq('B'),
    df['ACTION'].eq('SIT')
]
choices = [df['CHANGE'], df['CHANGE'], 0, 0]
df['GAIN/LOSS'] = np.select(conditions, choices)
df = df[::-1]

df.loc[8, 'BALANCE'] = 100.0000

for i in df.index[::-1][:-1]:
        df.loc[i - 1, 'BALANCE'] = df.loc[i, 'BALANCE']  + (df.loc[i, 'BALANCE'] * df.loc[i - 1, 'GAIN/LOSS'])

print(df)

上面的代码导致以下输出:

 ACTION  CHANGE  GAIN/LOSS     BALANCE

0    SIT    0.02       0.00  116.805289

1     BC   -0.02      -0.02  116.805289

2     BH    0.17       0.17  119.189070

3     BH   -0.01      -0.01  101.871000

4     BH    0.05       0.05  102.900000

5     BH   -0.02      -0.02   98.000000

6      B    0.02       0.00  100.000000

7    SIT    0.03       0.00  100.000000

8    SIT    0.01       0.00  100.000000

但是,我正在寻找一些代码,其中 BALANCE 仅在 BC 行上更新,并且该行总结了 B 和 BC 之后的第一个 BH 之间发生的净变化基本上我希望我的数据帧如下所示:在第 1 行BALANCE 列总结了 BC 和第一个 BH 之间的净变化,即 17%,输出如下所示:

 ACTION  CHANGE  GAIN/LOSS     BALANCE

0    SIT    0.02       0.00  117.000000

1     BC   -0.02      -0.02  117.000000

2     BH    0.17       0.17  100.000000

3     BH   -0.01      -0.01  100.000000

4     BH    0.05       0.05  100.000000

5     BH   -0.02      -0.02  100.000000

6      B    0.02       0.00  100.000000

7    SIT    0.03       0.00  100.000000

8    SIT    0.01       0.00  100.000000

标签: pythonpandas

解决方案


推荐阅读