np.vectorize возвращает неверно округленный результат - PullRequest
0 голосов
/ 18 декабря 2018

Я хотел бы применить одну и ту же функцию к двум кадрам данных.Оба имеют одинаковую строку 1, но разные строки 0. Я думаю, что в каждом кадре данных в строке 1 результат (D) должен быть одинаковым.Любые идеи, почему это выходит по-другому, пожалуйста?

df1 = pd.DataFrame({'A' : [1, 1],
                    'B' : [1, 1]})

df2 = pd.DataFrame({'A' : [1, 1],
                    'B' : [float('nan'), 1]})

C = 0.2

def fun (A, B):
    if math.isnan(B):
        return 1
    else:
        return A + C / B

df1['D'] = np.vectorize(fun)(df1['A'], df1['B'])
df2['D'] = np.vectorize(fun)(df2['A'], df2['B'])

DF

1 Ответ

0 голосов
/ 18 декабря 2018

Вы должны стремиться к векторизации везде, где это возможно.Например, лучший способ сделать это с помощью

df2.A + .2 * df2.B

0    NaN
1    1.2
dtype: float64

Или, еще лучше,

np.where(df2.B.isna(), 1, df2.A + .2 * df2.B)
array([1. , 1.2])

Предполагая, что это замена для более сложной функции,причина в том, что dtype проблема несовпадения ... возвращаемое значение усекается до int.Попробуйте передать параметр otypes=[float] в vectorize, чтобы указать тип возвращаемого значения float.

f = np.vectorize(fun, otypes=[float])
f(df2['A'], df2['B'])
array([1. , 1.2])

f(df1['A'], df1['B'])
array([1.2, 1.2])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...