Pandas 包含两列之间最小差值的行-不带groupby

Pandas 包含两列之间最小差值的行-不带groupby,pandas,Pandas,在由…生成的示例数据中 np.random.seed(2020) sz = 20 df = pd.DataFrame(np.random.randn(sz, 2), index=range(sz), columns=list('AB')) df.insert(0, 'Item', 'X') …要获取包含最小差值的行,此操作将正常工作: df.iloc[df.groupby('Item').apply(lambda x:abs(x['A']-x['B']).idxmin())] 但是,删除gro

在由…生成的示例数据中

np.random.seed(2020)
sz = 20
df = pd.DataFrame(np.random.randn(sz, 2), index=range(sz), columns=list('AB'))
df.insert(0, 'Item', 'X')
…要获取包含最小差值的行,此操作将正常工作:

df.iloc[df.groupby('Item').apply(lambda x:abs(x['A']-x['B']).idxmin())]

但是,删除
groupby
using以获取相应的
df.iloc

  • df.apply(lambda x:abs(x.A-x.B).idxmin())
    抛出错误
    AttributeError:'Series'对象没有属性“A”

  • df.apply(lambda x:abs(x['A']-x['B']).idxmin())
    抛出另一个错误类型
    keyrerror:'A'

  • 为什么会这样


    在不使用
    groupby
    的情况下,获得最小差值的正确代码是什么?

    执行应用时,必须提供其应循环的轴。默认情况下,它会一列接一列地显示,因此会显示您收到的消息

    以下工作将起作用:
    df.apply(λx:abs(x['A']-x['B']),轴=1.idxmin()

    但是,不需要使用lambda,您可以执行以下操作:
    abs(df['A']-df['B']).idxmin()
    (df['A']-df['B']).abs().idxmin()


    这两种方法都比使用应用程序快得多。

    两种
    abs
    apply
    都没有矢量化。您应该只执行
    df.loc[(df.A-df.B.abs().idxmin()]
    Thx。知道为什么1)和2)给出不同的错误代码吗?