Python产品问题

Python产品问题,python,pandas,dataframe,Python,Pandas,Dataframe,我仍在努力处理以下代码: xa= [0, 0, 0, 0, 65, 67, 69, 75, 0, 0, 0] xb = [.3, .3, .3,.3, .3, .3, .3, .3, .3, .3, .3] ideal = [0, 0, 0, 0, 65, 67, 69, 75, 67.5, 60.75, 54.675] df = pd.DataFrame({'a':xa, 'b':xb, 'i':ideal}) mask=(df['a']<51) & (df['b']>

我仍在努力处理以下代码:

xa= [0, 0, 0, 0, 65, 67, 69, 75, 0, 0, 0]
xb = [.3, .3, .3,.3, .3, .3, .3, .3, .3, .3, .3]
ideal = [0, 0, 0, 0, 65, 67, 69, 75, 67.5, 60.75, 54.675]

df = pd.DataFrame({'a':xa, 'b':xb, 'i':ideal})

mask=(df['a']<51) & (df['b']>0)
df['c'] = df['a'].where(mask,0.9).groupby(~mask.cumsum()).cumprod()

print(df)
xa=[0,0,0,65,67,69,75,0,0,0,0]
xb=[.3、.3、.3、.3、.3、.3、.3、.3、.3、.3、.3]
理想=[0,0,0,0,65,67,69,75,67.5,60.75,54.675]
数据帧({'a':xa,'b':xb,'i':理想})
掩码=(df['a']0)
df['c']=df['a'].where(mask,0.9).groupby(~mask.cumsum()).cumprod()
打印(df)
我希望“c”列变成“理想”列。这只是我的100K+行完整数据集的一个示例

“面具”是这样计算的: 什么时候'a'{i}0?那么对还是错

“c”列的计算方式如下: 当'mask'{i}=FALSE时,则'c'{i}='a'{i}否则'c'{i}=0.9*'c'{i-1}


所以我希望(有一天)“c”变成“理想的”…

如果我理解正确的话

mask=(df['a']<51) & (df['b']>0)
df['c'] = np.where(mask, df['i'].shift() * 0.9, df['i'])
df.fillna(0, inlace = True)

    a   b   i       c
0   0   0.3 0.000   0.000
1   0   0.3 0.000   0.000
2   0   0.3 0.000   0.000
3   0   0.3 0.000   0.000
4   65  0.3 65.000  65.000
5   67  0.3 67.000  67.000
6   69  0.3 69.000  69.000
7   75  0.3 75.000  75.000
8   0   0.3 67.500  67.500
9   0   0.3 60.750  60.750
10  0   0.3 54.675  54.675
mask=(df['a']0)
df['c']=np.where(掩码,df['i'].shift()*0.9,df['i']))
df.fillna(0,嵌入=真)
a b i c
0   0   0.3 0.000   0.000
1   0   0.3 0.000   0.000
2   0   0.3 0.000   0.000
3   0   0.3 0.000   0.000
4   65  0.3 65.000  65.000
5   67  0.3 67.000  67.000
6   69  0.3 69.000  69.000
7   75  0.3 75.000  75.000
8   0   0.3 67.500  67.500
9   0   0.3 60.750  60.750
10  0   0.3 54.675  54.675

我相信这可以解决您的问题:

# First calculate the column as if there is no decay
mask=(df['a']<51) & (df['b']>0)
df['c'] = df['a'].where(~mask)
df['c'].fillna(method='ffill', inplace=True)
df['c'].fillna(0, inplace=True)

# Check how many rows since the mask has changed from True to False or v.v.
df['ones'] = 1
df['power'] = df['ones'].groupby((mask != mask.shift()).cumsum()).transform('cumsum')
# For the values in the mask, apply the decay
df['c'] = np.where(mask, 0.9 ** df['power']*df['c'], df['c'])
print(df)

主要的技巧是定义一列,该列定义0.9相乘的次数,另一列向前填充,以检查如果没有衰减,数字会是多少。希望这有帮助

我不想使用理想或“我”。我把它放在那里只是为了给你展示我需要的结果;你可以自由地尝试“a”和“b”来代替。你的逻辑不是面向数据分析的,而是通用的逻辑和数学,而且实际上是有效的!我喜欢你的方法。谢谢!
     a    b       i       c  power ones
0    0  0.3   0.000   0.000       1     1
1    0  0.3   0.000   0.000       2     1
2    0  0.3   0.000   0.000       3     1
3    0  0.3   0.000   0.000       4     1
4   65  0.3  65.000  65.000       1     1
5   67  0.3  67.000  67.000       2     1
6   69  0.3  69.000  69.000       3     1
7   75  0.3  75.000  75.000       4     1
8    0  0.3  67.500  67.500       1     1
9    0  0.3  60.750  60.750       2     1
10   0  0.3  54.675  54.675       3     1