2016-06-09 1 views
1

Я использую метод применения pandas как для серий, так и для dataframe, но я, очевидно, все еще что-то пропущу, потому что я нахожусь в тупике по простой функции, которую я пытаюсь выполнить.Метод применения Pandas

Это то, что я делаю:

def minmax(row): 
    return (row - row.min())/(row.max() - row.min()) 

row.apply(minmax) 

но это возвращает все нулевой серии. Например, если

row = pd.Series([0, 1, 2]) 

затем

minmax(row) 

возвращается [0,0, 0,5, 1,0], по желанию. Но, row.apply (minmax) возвращает [0,0,0].

Я считаю, что это происходит потому, что серия из Интс и целочисленное деление возвращает 0. Однако, я не понимаю,

  • почему он работает с MinMax (строка) (она не должна действовать так то же?), и
  • как правильно его применить в функции apply, чтобы возвращать соответствующие значения float (я пытался использовать его с использованием .astype, и это дает мне все NaNs ... которые я также не понимаю)
  • , если применить это к кадру данных, так как df.apply (minmax) также работает по желанию. (изменить)

Я подозреваю, что у меня нет чего-то принципиального в том, как действует приложение ... или плотно. в любом случае, спасибо заранее.

+0

какая версия панд вы используете? Я не могу воспроизвести это. –

+0

ах ... ну, это дает мне некоторую поддержку. Кроме того, я просто добавил, что применение его к фреймворку данных просто отлично, как есть. pandas 0.18.0 ... –

ответ

1

Когда вы звоните row.apply(minmax) по адресу Series, значения функции передаются функции. Это называется element-wise.

Invoke function on values of Series. Can be ufunc (a NumPy function that applies to the entire Series) or a Python function that only works on single values.

При вызове row.apply(minmax) на через DataFrame либо строк (по умолчанию) или столбцов передаются функции (в соответствии со значением axis).

Objects passed to functions are Series objects having index either the DataFrame’s index (axis=0) or the columns (axis=1). Return type depends on whether passed function aggregates, or the reduce argument if the DataFrame is empty. This is called row-wise or column-wise.

Вот почему ваш пример работает, как ожидалось на DataFrame, а не на Series. Проверьте это answer для получения информации о функциях отображения до Series.

+0

Ах! Я игнорировал, что единственными функциями, которые могут применяться ко всей серии, являются numpy-функции. Таким образом, в этом конкретном случае применение действует так же, как и карта. Можете ли вы объяснить, почему python не расстраивается по поводу применения значений min() и .max() к значениям? В этом контексте это не имеет смысла, и я ожидал бы ошибки. Я сделал это, row.apply (lambda x: x - x.min()), чтобы проверить, что вы говорите, и также возвращает [0,0,0], поэтому я собираю x.min() == x но я думаю, что это будет ошибкой. благодаря! –

+0

Это странно, в моем тесте вызов функции в 'Series' вызывает ошибку' AttributeError: 'int' объект не имеет атрибута 'min''. Кажется, это ожидаемое поведение. – Romain

+0

Хм. какие панды вы используете? Я воссоздал его без ошибки как в Juypter (где я работал), так и в качестве скрипта в PyCharm.Привлечение ошибки сэкономило бы мне много времени. :) Я обновлю до 0.18.1 и посмотрю. еще раз спасибо. –