我的问题是从一组仅在特定列[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列是什么意思,所以我将逻辑应用于所有三列。