Функция для применения преобразования журнала к нескольким переменным в Python - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь применить преобразование журнала к нескольким столбцам из Dataframe в Python с помощью этой функции.

def log(x):
       if type(x) is float64 or int64:
              apply(np.log(x+1))
       else:
              return x

df2.apply(log)

Я получаю следующую ошибку:

NameError: ("name 'float64' is not defined", 'occurred at index CUSTID')

CUSTID - первый категориальный столбец в кадре данных

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

я думаю, что это сработает

for c in [c for c in df.columns if np.issubdtype(df[c].dtype , np.number)]:
    df[c] = np.log(df[c])

Пример кода: import pandas as pd import numpy as np

df = pd.DataFrame(
[
[2, 4, "A"],
[4, 5, "C"],
[5, 4, "B"],

[10, 4.2, "A"],
[9, 3, "B"],
[3, 3, "C"]
], columns=['data1', 'data2', 'Categories'])

for c in [c for c in df.columns if np.issubdtype(df[c].dtype , np.number)]:
    df[c] = np.log(df[c])

Вывод:

      data1     data2 Categories
0  0.693147  1.386294          A
1  1.386294  1.609438          C
2  1.609438  1.386294          B
3  2.302585  1.435085          A
4  2.197225  1.098612          B
5  1.098612  1.098612          C
0 голосов
/ 19 сентября 2018

NameError, вероятно, из-за ошибки импорта.Если у вас есть

import numpy as np

, вам нужно ссылаться на типы данных как np.float64 и np.int64.В противном случае ваш импорт должен быть

from numpy import float64, int64

Кроме того, это более распространенный стиль для записи

if isinstance(x, np.float64) or isinstance(x, np.int64)

или (эквивалентный, но более простой)

if isinstance(x, (np.float64, np.int64))

, который такжеработает для подклассов (хотя я сомневаюсь, что в этом случае будет какая-то разница)

...