我有以下dataframe:
Index_Date A B C D
================================
2015-01-31 10 10 Nan 10
2015-02-01 2 3 Nan 22
2015-02-02 10 60 Nan 280
2015-02-03 10 100 Nan 250
要求:
Index_Date A B C D
================================
2015-01-31 10 10 10 10
2015-02-01 2 3 23 22
2015-02-02 10 60 290 280
2015-02-03 10 100 3000 250
Column C
是通过取D
的value
而得到的2015-01-31
。
然后我需要使用C
的value
为2015-01-31
,乘以2015-02-01
上A
的value
,然后加上B
。
我已经尝试了一个apply
和一个shift
使用一个if else
通过这给出了一个关键错误。
7条答案
按热度按时间jhkqcmku1#
首先,创建派生值:
然后遍历剩余的行并填充计算出的值:
taor4pac2#
给定一列数字:
您可以使用
shift
引用上一行:您可以使用
fill_value
参数填充缺少的值zhte4eai3#
numba
对于不可向量化的递归计算,
numba
使用JIT编译并与较低级别的对象一起工作,通常会产生很大的性能改进。你只需要定义一个常规的for
循环,并使用装饰器@njit
或(对于旧版本)@jit(nopython=True)
:对于一个合理大小的 Dataframe ,与常规的
for
循环相比,性能提高了约30倍:vecaoik14#
在numpy数组上应用递归函数将比当前的答案更快。
输出
ruoxqz4g5#
虽然这个问题已经有一段时间没有被问到了,但我还是会把我的答案贴出来,希望能对大家有所帮助。
所以基本上我们使用了pandas中的
apply
和一个全局变量来跟踪之前计算的值。与
for
循环的时间比较:平均速度是0.57倍。
hmae6n7t6#
这是一个老问题,但下面的解决方案(没有for循环)可能会有所帮助:
vkc1a9a27#
一般来说,避免显式循环的关键是在rowindex-1==rowindex上连接(合并)2个 Dataframe 示例。
然后,您将有一个包含r和r-1行的大 Dataframe ,您可以从其中执行df.apply()函数。
然而,创建大型数据集的开销可能会抵消并行处理的好处。