
[英]Multiply pandas dataframe with factor from other dataframe
[英]How to multiply by a factor a set of data that is repeated in a dataframe?
我的问题是从仅在某些列 [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,Bird3\r\n0,100,50,200\r\n1,50,40,100\r\n2,40,40,80\r\n3,40,80,200\r\n4,40,50,200\r\n5,40,90,200\r\n6,100,12,40\r\n'
))
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 提高到 dataframe 的幂:
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
将您的 dataframe 乘以这些值:
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
我不确定你所说的只有某些列是什么意思,所以我将逻辑应用于所有三列。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.