这是我的数据帧:
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
的累积最小值(cumulative minimum),但在特定条件下会改变。我将逐行解释:
操作首先从计算累积最小值开始:
df['c'] = df.b.cummin()
改变 c
值的条件是:
cond = df.a.shift(1) > df.c.shift(1)
现在关键在于满足 cond == True
的行。对于这些行,我们令 df.c
等于 df.b
,并且 b
列的累积最小值会在该位置重置。
例如,第一次满足条件 cond
的是在第 4 行,此时 c
的值变为 110(换句话说,c
取当前行的 b
值)。而对于下一行(第 5 行),c
的值将是自第 4 行起 b
列的新一轮累积最小值,依此类推直至最后一行。
这是我尝试的一种方法,但它在 cond
条件成立的地方未能正确工作:
df['c'] = df.b.cummin()
df.loc[df.a.shift(1) > df.c.shift(1), 'c'] = df.b
附注:
上述例子中接受的答案能够正常运行并达到预期结果。然而,在处理比这个示例大得多的实际数据时,该方法并未如预期那样工作。我尚未找到其中的问题所在。
不过我很喜欢这个答案,它在我的情况下能有效运作,并且简洁高效。尽管如此,我没有更改已接受的答案,因为它提供了一个向量化解决方案。