ID Op Cl V C R0 R1 R2 R3 R4 R5
UN 22.85 22.86 8830500 0.21 25 34 12 87 105 102
SS 55.01 52.67 6500 5.45 84 122 147 124 644 788
PN 90.00 90.99 1000 102 89 55 100 156 44 87
PI 184.99 182.38 15000 84 56 77 97 45 44 33
我想创建一个新列,在R0,R1,R2,R3,R4,R5
列中显示仅次于'Cl'
的下一个最大值。以下是我的预期结果:
ID Op Cl V C R0 R1 R2 R3 R4 R5 X
UN 22.85 22.86 8830500 0.21 25 34 12 87 105 102 25
SS 55.01 52.67 6500 5.45 84 122 147 124 644 788 84
PN 90.00 90.99 1000 102 89 55 100 156 44 87 100
PI 184.99 182.38 15000 84 56 77 97 45 44 33 NaN
我一直在研究它,但没有运气。我们将感谢您的帮助,谢谢!
取决于下一个最大值的含义。如果你的意思是R0->R5
的订单,我们可以试试idxmax
:
# extract the `R` columns
s = df.filter(like='R')
# find out where these columns are larger than `Cl`:
mask = s.gt(df['Cl'], axis='rows')
# extract the values with `idxmax` and `lookup`:
df['X'] = np.where(mask.any(1), s.lookup(s.index,mask.idxmax(1)), np.nan)
输出:
ID Op Cl V C R0 R1 R2 R3 R4 R5 X
0 UN 22.85 22.86 8830500 0.21 25 34 12 87 105 102 25.0
1 SS 55.01 52.67 6500 5.45 84 122 147 124 644 788 84.0
2 PN 90.00 90.99 1000 102.00 89 55 100 156 44 87 100.0
3 PI 184.99 182.38 15000 84.00 56 77 97 45 44 33 NaN
如果下一个最大值是指值,我们可以用sort
:修改上面的值
# extract and sort by rows
s = np.sort(df.filter(like='R').values, axis=1)
# now we work with numpy data:
mask = s > df['Cl'].values[:,None]
# check and assign
df['X'] = np.where(mask.any(1), s[np.arange(s.shape[0]),mask.argmax(1)], np.nan)
然后,您几乎得到了相同的输出(对于这个示例数据(,但当然具有上述含义。
另一种选择:
def func(x):
R_values = x[1:]
idx_greater = R_values > x[0]
return np.where(idx_greater.any(), R_values[idx_greater].min(), np.nan)
df['X'] = df.filter(regex='Cl|^R').apply(func, axis=1)
输出:
ID Op Cl V C R0 R1 R2 R3 R4 R5 X
0 UN 22.85 22.86 8830500 0.21 25 34 12 87 105 102 25.0
1 SS 55.01 52.67 6500 5.45 84 122 147 124 644 788 84.0
2 PN 90.00 90.99 1000 102.00 89 55 100 156 44 87 100.0
3 PI 184.99 182.38 15000 84.00 56 77 97 45 44 33 nan
这可能比@Quang Hoang的方法慢一点,也不那么优雅。
这背后的逻辑是每行应用一个函数,该函数验证是否有任何R值大于Cl
列中的值,然后获得这些值的最小值,否则返回NaN。
注意:Cl
列应该在R
列之前,就像您提供的数据一样。