您可以创建一列绝对差异:
df['dif'] = (df['values'] - 2).abs()dfOut: category values dif0 a 1 11 b 2 02 b 3 13 b 4 24 c 5 35 a 4 26 b 3 17 c 2 08 c 1 19 a 0 2
然后使用
groupby.transform检查每个组的最小值是否等于您计算出的差:
df['is_closest'] = df.groupby('category')['dif'].transform('min') == df['dif']dfOut: category values dif is_closest0 a 1 1 True1 b 2 0 True2 b 3 1 False3 b 4 2 False4 c 5 3 False5 a 4 2 False6 b 3 1 False7 c 2 0 True8 c 1 1 False9 a 0 2 Falsedf.groupby('category')['dif'].idxmin()还会为您提供每个类别的最接近值的索引。您也可以将其用于映射。供选择:
df.loc[df.groupby('category')['dif'].idxmin()]Out: category values dif0 a 1 11 b 2 07 c 2 0分配:
df['is_closest'] = Falsedf.loc[df.groupby('category')['dif'].idxmin(), 'is_closest'] = TruedfOut: category values dif is_closest0 a 1 1 True1 b 2 0 True2 b 3 1 False3 b 4 2 False4 c 5 3 False5 a 4 2 False6 b 3 1 False7 c 2 0 True8 c 1 1 False9 a 0 2 False这些方法之间的差异在于,如果对照差异检查相等性,则在有联系的情况下,所有行都将为True。但是,
idxmin第一次出现时,它将返回True(每个组仅返回一个)。



