如何将数据帧中重复的一组数据乘以一个因子



我的问题是从一组仅在特定列[Bird1和Bird2]中重复的数字的第一个数字开始应用乘法因子K=0.5。此系数将应用于上次计算的值,直到最后一个重复的值为止。

表A:

Bird1  Bird2  Bird3 

100  50      200  
50   40      100  
40   40      80  
40   80      200  
40   50      200 
40   90      200 
100  12      40 

结果应如下表所示。如何在python中实现这些代码?

表B:

Bird1     Bird2     Bird3 
100       50        200  
50        40        100  
40        40        80  
**20**      80        200  
**10**      50      **100** 
**5**       90      **50** 
100        12        40

使用df.interpolate()命令不合适,因为它使用了所有值​​重复的行。我只希望常数K从第一个值开始并应用于第一个值,并且在下一个值中重复此乘法,直到重复行的最后一个值。

我使用的一种策略是使用df.ne(0)命令来比较行并检查它们是否具有相同的值,但我在实现它时遇到了问题

import pandas as pd
from io import StringIO
df = pd.read_csv(StringIO(',Bird1,Bird2,Bird3rn0,100,50,200rn1,50,40,100rn2,40,40,80rn3,40,80,200rn4,40,50,200rn5,40,90,200rn6,100,12,40rn'
))
k = 0.5

首先,找到当前值等于下一个值的位置:

a = (df.shift(1) == df) != 0
Bird1  Bird2  Bird3
0  False  False  False
1  False  False  False
2  False   True  False
3   True  False  False
4   True  False   True
5   True  False   True
6  False  False  False

然后用这个答案的一些魔力,在True上向上计数,在False上重置计数器:

k_power = (a.cumsum()-a.cumsum().where(~a).ffill().fillna(0).astype(int))
Bird1  Bird2  Bird3
0      0      0      0
1      0      0      0
2      0      1      0
3      1      0      0
4      2      0      1
5      3      0      2
6      0      0      0

将k提高到数据帧的幂:

multiplier = k ** k_power
Bird1  Bird2  Bird3
0  1.000    1.0   1.00
1  1.000    1.0   1.00
2  1.000    0.5   1.00
3  0.500    1.0   1.00
4  0.250    1.0   0.50
5  0.125    1.0   0.25
6  1.000    1.0   1.00

将数据帧乘以以下值:

df * multiplier
Bird1  Bird2  Bird3
0  100.0   50.0  200.0
1   50.0   40.0  100.0
2   40.0  *20.0*  80.0
3  *20.0*  80.0  200.0
4  *10.0*  50.0 *100.0*
5  * 5.0*  90.0 * 50.0*
6  100.0   12.0   40.0

我不知道你所说的只有certian列是什么意思,所以我将逻辑应用于所有三列。

相关内容

  • 没有找到相关文章

最新更新