使用df.div和conditions填充pandas数据框列值不能按预期工作

lf5gs5x2  于 2023-09-29  发布在  其他
关注(0)|答案(1)|浏览(76)

我目前正在尝试使用以下代码将我的嵌套框架中的列fractShrs的值从初始值1设置为(numShrs (t) / numShrs(t+1)

def populate_fraction_of_shares(df: pd.DataFrame) -> pd.DataFrame: 
    # Create a mask with all numShrs that are different set to True
    mask = df['numShrs'] != df['numShrs'].shift()   

    # Apply the mask to only divide by the different ones
    df['fractShrs'] = df['numShrs'].div(df['numShrs'].shift().where(cond=mask, other=1))
    
    # Normalize values dividing by the numShrs of the last row, so we start by 1
    df['fractShrs'] = df['fractShrs'].div(df.iloc[-1]['numShrs'])

我的数据框看起来像这样

VWAP    VWAPAdj country dividend    dividendAdj freeFloatPct    numShrs pxAsk   pxAskAdj    pxBid   pxBidAdj    pxHigh  pxHighAdj   pxLast  pxLastAdj   pxLow   pxLowAdj    returnIndex turnover    volume  isin    name    currency    fractShrs
date                                                                                                
2023-07-03  176.503682  176.503682  USA 1.00    1.00    94.0    150.00  176.352591  176.352591  176.343429  176.343429  177.644518  177.644518  176.343429  176.343429  175.702037  175.702037  193326.88   5.547447e+09    31458200.0  US0378331005    APPLE INC COM   EUR 1
2023-07-05  176.535496  176.535496  USA 1.00    1.00    94.0    150.00  176.292623  176.292623  176.283409  176.283409  177.812933  177.812933  176.292623  176.292623  175.638415  175.638415  192191.75   8.271696e+09    46920262.0  US0378331005    APPLE INC COM   EUR 1
2023-07-06  175.203695  175.203695  USA 1.00    1.00    94.0    600.00  176.125087  176.125087  176.106719  176.106719  176.345505  176.345505  176.152638  176.152638  173.755691  173.755691  192673.94   7.954350e+09    45156008.0  US0378331005    APPLE INC COM   EUR 1

应该发生的是,假设从1到4的份额数量(如2023-07-06发生的情况,从150到600),那么fractShrs应该从1到0.25,这是从底部传播到顶部,保持在0.25,直到numShrs再次改变并执行另一次计算。
我的代码应用了一个掩码,将numShrs更改为True的行设置为False,这对每一行都很有效,除了那些设置为True的行,其中1/numShrs正在发生,并且我得到了像6.35780394e-8这样的巨大值,但我想在这种情况下使用与numShrs相同的值。
我试过这么做

... 

    df['fractShrs'] = df['numShrs'].div(df['numShrs'].shift().where(cond=mask, other=df['numShrs']))

    ...

但它不起作用,我只是想在where条件不匹配时使用numShrs的当前值。
非常感谢,提前为这篇长文章道歉。

uajslkp6

uajslkp61#

使用df['fractShrs'] = df['numShrs'].div(df['numShrs'].shift().where(cond=mask, other=df['numShrs']))尝试的方法几乎是正确的,但是where方法返回的值是df['numShrs'].shift()(条件是True)和df['numShrs'](条件是False),因此当条件是True时,它仍然会除以df['numShrs'].shift()
为了实现所需的行为,您可以考虑使用NumPy中的np.where函数来应用所需的逻辑,如下所示:

import pandas as pd
import numpy as np

def populate_fraction_of_shares(df: pd.DataFrame) -> pd.DataFrame:

    mask = df['numShrs'] != df['numShrs'].shift()
    df['fractShrs'] = np.where(mask, df['numShrs'], df['numShrs'].shift())
    df['fractShrs'] = df['fractShrs'] / df.iloc[-1]['numShrs']

    return df

希望这能帮到你!

相关问题