繁体   English   中英

如何将 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM