Строка, содержащая минимальное значение разницы между двумя столбцами 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())]

Однако удаление groupby using для получения соответствующего df.iloc :

  1. df.apply(lambda x: abs(x.A - x.B).idxmin()) выдает ошибку AttributeError: 'Series' object has no attribute 'A'

  2. df.apply(lambda x: abs(x['A']- x['B']).idxmin()) выдает другой тип ошибки KeyError: 'A' !!!

Почему это происходит?

Каков правильный код для получения минимального значения разницы без использования groupby ?

Комментарии:

1. Оба abs и apply не векторизованы. Вы должны просто сделать df.loc[(df.A - df.B).abs().idxmin()]

Ответ №1:

При выполнении apply вы должны указать ось, по которой она должна проходить. По умолчанию он будет идти по столбцам, отсюда и сообщения, которые вы получаете.

Будет работать следующее: df.apply(lambda x: abs(x['A']- x['B']), axis=1).idxmin()

Однако нет необходимости использовать лямбда, вы можете сделать: abs(df['A']- df['B']).idxmin() или (df['A']- df['B']).abs().idxmin()

Которые оба также намного быстрее, чем при использовании apply .

Комментарии:

1. Спасибо. Есть идеи, почему 1) и 2) дают разные коды ошибок?