【问题标题】:How to do a calculation only at some rows of my dataframe?如何仅在我的数据框的某些行上进行计算?
【发布时间】:2018-11-18 01:45:33
【问题描述】:

假设我有一个只有两列和 20 行的数据框,其中第一列的所有值都等于 10,第二行的所有值都是随机百分比数。

现在,我想将第一列与第二列的百分比值相乘 +1,但只是在某些时间间隔内,然后将最后一个值复制到下一行。

例如我想从第 5 行到第 10 行做这个乘法运算。

问题是我不知道根据df的索引在任意点开始和结束计算。

输入数据示例:

df = pd.DataFrame(np.random.randint(0,10,size=(20, 2)), columns=list('AB'))
df['A'] = 10
df['B'] = df['B'] /100

产生:

      A     B
0   10  0.07
1   10  0.02
2   10  0.05
3   10  0.00
4   10  0.01
5   10  0.09
6   10  0.00
7   10  0.02
8   10  0.03
9   10  0.05
10  10  0.05
11  10  0.03
12  10  0.01
13  10  0.09
14  10  0.06
15  10  0.07
16  10  0.01
17  10  0.01
18  10  0.01
19  10  0.07

我想得到的输出是第一行仅在母猪行通过累加乘法的位置,如下所示:

      C       B
0   10     0.07
1   10     0.02
2   10     0.05
3   10     0.00
4   10     0.01
5   10,9   0.09
6   10,9   0.00
7   11,11  0.02
8   11,45  0.03
9   12,02  0.05
10  12,62  0.05
11  12,62  0.03
12  12,62  0.01
13  12,62  0.09
14  12,62  0.06
15  12,62  0.07
16  12,62  0.01
17  12,62  0.01
18  12,62  0.01
19  12,62  0.07

谢谢!

【问题讨论】:

  • 请提供您想要使用的输入数据样本以及您期望的输出数据,因为当我们不真正知道您想要什么时,您的问题目前很难回答。嘿,如果它适合你在里面扔一些代码,你也试过了!
  • 我添加了一些示例数据。不幸的是,我没有任何值得分享的尝试。

标签: python python-3.x pandas dataframe


【解决方案1】:

要获得递归乘积,您可以执行以下操作:

start = 5
end = 10

df['C'] = ((1+df.B)[start:end+1].cumprod().reindex(df.index[:end+1]).fillna(1)*df.A).ffill()

输出:

     A     B          C
0   10  0.07  10.000000
1   10  0.02  10.000000
2   10  0.05  10.000000
3   10  0.00  10.000000
4   10  0.01  10.000000
5   10  0.09  10.900000
6   10  0.00  10.900000
7   10  0.02  11.118000
8   10  0.03  11.451540
9   10  0.05  12.024117
10  10  0.05  12.625323
11  10  0.03  12.625323
12  10  0.01  12.625323
13  10  0.09  12.625323
14  10  0.06  12.625323
15  10  0.07  12.625323
16  10  0.01  12.625323
17  10  0.01  12.625323
18  10  0.01  12.625323
19  10  0.07  12.625323

说明:

计算(1 + df.B)的累积乘积,即乘以df.A得到递归乘积的因数。仅在指定的范围内执行此操作。 reindex 并用 1 填充 start 之前的行,因此该值在此范围之前保持不变。

乘以df.A 得到实际值,在您指定的范围后向前填充值。

【讨论】:

  • 就是这样!它在使用多个范围时完美运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-05
  • 2014-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-28
  • 2021-10-03
相关资源
最近更新 更多