#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
:
-
df.apply(lambda x: abs(x.A - x.B).idxmin())
выдает ошибкуAttributeError: 'Series' object has no attribute 'A'
-
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) дают разные коды ошибок?