根据计算条件更新 DataFrame 中的值

Update values in DataFrame based on criteria with calculation

最终目标是我试图修改原始股票价格数据作为 20:1 股票拆分的结果。

raw_data 我使用下面的代码提取了相关的 ticker ('IPL') 和 date (< '2008-10-01'):

raw_data[(raw_data['ticker'] =='IPL') & (raw_data['date']<'2008-10-01')]

结果数据框如下:

     ticker    date      open   high    low      close  volume     return
687     IPL 2008-01-02  117.00  118.48  116.81  117.16  150971.0    NaN
2146    IPL 2008-01-03  117.16  123.82  116.80  120.96  240929.0    0.032434
3617    IPL 2008-01-04  123.06  127.24  120.20  125.60  329834.0    0.038360
5156    IPL 2008-01-07  125.60  126.21  121.61  121.63  266578.0    -0.031608
6731    IPL 2008-01-08  119.70  121.93  118.75  119.58  362860.0    -0.016854
... ... ... ... ... ... ... ... ...
259572  IPL 2008-09-10  126.00  130.50  125.10  129.00  1046421.0   -0.030075
260940  IPL 2008-09-11  133.50  134.55  131.82  132.50  599706.0    0.027132
262251  IPL 2008-09-12  136.00  142.00  134.03  139.01  475591.0    0.049132
263608  IPL 2008-09-15  139.00  143.00  135.50  139.93  390052.0    0.006618
264980  IPL 2008-09-16  136.00  137.40  131.11  132.00  489557.0    -0.056671

我尝试遍历 for 循环和 .loc[] 但我完全卡住了。

我还尝试了以下 &and:

for i, row in raw_data.iterrows():
    close_val = ['close']
    if raw_data[(raw_data['ticker'] =='IPL') and (raw_data['date']<'2008-10-01')]:
        close_val = ['close'] * 0.05
    df.at[i,'close'] = close_val

但是我得到以下错误:

"ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()."

基本上,我需要将 2008-09-17 之前的所有价格 open, high, low, close 乘以 0.05,然后将 volume 除以 0.05。

Pandas 很聪明,可以让您将 DataFrame 列(即系列)视为向量。因此,如果您将一列乘以一个数字,pandas 会将该列中的每一行乘以该数字。这甚至适用于整个 DataFrame,因此您可以 select 任何您喜欢的子帧(例如,通过使用列名列表进行索引),然后乘以一个标量,如下所示(假设 DataFrame 具有您提取的感兴趣的日期从原始数据中调用 df).

df[['open', 'high', 'low', 'close']] = 0.05 * df[['open', 'high', 'low', 'close']]
df['volume'] = 20 * df['volume']
df

结果:

        ticker  date        open    high    low     close   volume      return
687     IPL     2008-01-02  5.850   5.9240  5.8405  5.8580  3019420.0   NaN
2146    IPL     2008-01-03  5.858   6.1910  5.8400  6.0480  4818580.0   0.032434
3617    IPL     2008-01-04  6.153   6.3620  6.0100  6.2800  6596680.0   0.038360
5156    IPL     2008-01-07  6.280   6.3105  6.0805  6.0815  5331560.0   -0.031608
6731    IPL     2008-01-08  5.985   6.0965  5.9375  5.9790  7257200.0   -0.016854
...
259572  IPL     2008-09-10  6.300   6.5250  6.2550  6.4500  20928420.0  -0.030075
260940  IPL     2008-09-11  6.675   6.7275  6.5910  6.6250  11994120.0  0.027132
262251  IPL     2008-09-12  6.800   7.1000  6.7015  6.9505  9511820.0   0.049132
263608  IPL     2008-09-15  6.950   7.1500  6.7750  6.9965  7801040.0   0.006618
264980  IPL     2008-09-16  6.800   6.8700  6.5555  6.6000  9791140.0   -0.056671