这是我的DataFrame:
import pandas as pd
df = pd.DataFrame(
{
'a': [98, 97, 100, 135, 103, 100, 105, 109, 130],
'b': [100, 103, 101, 105, 110, 120, 101, 150, 160]
}
)
字符串
这是我们想要的输出。我想创建列c
:
a b c
0 98 100 100
1 97 103 100
2 100 101 100
3 135 105 100
4 103 110 110
5 100 120 110
6 105 101 101
7 109 150 150
8 130 160 150
型
对我来说,用纯英语描述这个问题并不容易,因为它有点复杂。c
是df.b.cummmin()
,但在某些条件下它会发生变化。我逐行描述它:
该过程开始于:
df['c'] = df.b.cummin()
型
改变c
的条件是:
cond = df.a.shift(1) > df.c.shift(1)
型
现在重要的是那些行cond == True
,对于这些行df.c = df.b
和b
的cummin()
重置。
例如,cond
的第一个示例是行4
。所以c
变为110(换句话说,无论b
是什么)。对于行5
,它是来自行4
的b
的cummin()
。逻辑到最后都是一样的。
这是我的尝试之一。但它在cond
启动时不起作用:
df['c'] = df.b.cummin()
df.loc[df.a.shift(1) > df.c.shift(1), 'c'] = df.b
型
3条答案
按热度按时间a0zr77ik1#
IIUC,您可以尝试:
字符串
输出(* 包括中间体 *):
型
4uqofj5v2#
验证码
我找不到一种方法来进行矢量化操作。
尝试同时:
字符串
DF
型
中间体
第一轮while
型
lokaqttq3#
我不知道是否有可能将其向量化,但至少在普通Python中很容易,并且它是 O(n)。
个字符
如果你需要性能,you might be able to use Cython or Numba。