这是我的数据框:
import pandas as pd
df = pd.DataFrame({
'a': [10, 20, 30, 1, 20, 3, 4, 0],
'b': [30, 3, 11, 25, 24, 31, 29, 2],
'c': [True, True, True, False, False, True, True, True]
})
预期输出正在创建列d
:
a b c d
0 10 30 True NaN
1 20 3 True 10
2 30 11 True 20
3 1 25 False NaN
4 20 24 False NaN
5 3 31 True NaN
6 4 29 True 30
7 0 2 True 4
首先选择其中的值b
。c
我True
逐行解释这个过程,1
因为这样更容易理解。
中的值为b
3,则应检查其以上所有值。并且a
应选择其中大于 3 的最近值。因此选择 10。
对于行号2
,其值为 11。与该值最接近且大于该值的a
值为 20。
对于第 3 行和第 4 行,由于c
是False
,因此NaN
应该选择。
对于行5
,由于 中没有大于 31 的先前值a
,NaN
因此被选中。
对于行,其中大于 29 的6
最接近的值是 30。a
这是我迄今为止尝试过的方法。它没有给我输出。我认为我采取的方法可能是正确的。
t = df['a'].to_numpy()
h = df['b'].to_numpy()
m2 = t < h[:, None]
df['d'] = np.nanmax(np.where(m2, t, np.nan), axis=1)
要找到列“a”中大于列“b”中当前值的最近的前一个值(仅当“c”为 True 时),您可以使用矢量化方法或简单的循环解决方案。
这给了我这个输出:
一种有效的方法是
janitor
使用conditional_join
:输出: