我已将您的问题翻译成中文,方便您理解:
这是我的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.cummin()
,但在某些条件下会发生变化。逐行解释规则:
首先设置:
df['c'] = df.b.cummin()
改变 c
的条件是:
cond = df.a.shift(1) > df.c.shift(1)
当 cond == True
时,对于这些行,df.c
应该等于 df.b
的当前值,并且从这一行开始,b
的 cummin()
重新计算。
例如,第一个满足条件的位置在第4行,所以 c
变为110(即等于 b
的值)。然后对第5行而言,它的 c
是从第4行开始的 b
的 cummin()
值。以此类推至最后一行。
以下是您的尝试之一,但在 cond
条件生效的地方不起作用:
df['c'] = df.b.cummin()
df.loc[df.a.shift(1) > df.c.shift(1), 'c'] = df.b
注:
目前采纳的答案适用于这个示例,但对于您的实际大数据集可能无法得到预期结果。目前还未找到其中的问题所在。
然而,我非常喜欢这个答案,它对我而言既简单又有效。尽管未更改采纳答案,因为它提供了向量化解决方案。