У меня очень простая функция:
import numpy as np
from numba import jit
import pandas as pd
@jit
def f_(n, x, y, z):
for i in range(n):
z[i] = x[i] * y[i]
f_(df.shape[0], df["x"].values, df["y"].values, df["z"].values)
К которому я прохожу
df = pd.DataFrame({"x": [1, 2, 3], "y": [3, 4, 5], "z": np.NaN})
Я ожидал, что функция изменит столбец данных z
на месте следующим образом:
>>> f_(df.shape[0], df["x"].values, df["y"].values, df["z"].values)
>>> df
x y z
0 1 3 3.0
1 2 4 8.0
2 3 5 15.0
Это работает отлично в большинстве случаев, но каким-то образом не удается изменить данные в других.
Я дважды проверял вещи и:
- Я не определил никаких проблем с точками данных, которые могут вызвать эту проблему.
- Я вижу, что данные меняются, как ожидается, когда я печатаю результат.
- Если я
z
массивz
из функции, он будет изменен, как и ожидалось.
К сожалению, я не мог свести проблему к минимальному воспроизводимому случаю. Например, удаление несвязанных столбцов, по-видимому, "исправляет" проблему, делая невозможным сокращение.
Я использую jit
таким образом, который не предназначен для использования? Есть ли какие-либо пограничные случаи, о которых я должен знать? Или это может быть ошибка?
Изменить:
Я нашел источник проблемы. Это происходит, когда данные содержат дублированные имена столбцов:
>>> df_ = pd.read_json('{"schema": {"fields":[{"name":"index","type":"integer"},{"name":"v","type":"integer"},{"name":"y","type":"integer"},
... {"name":"v","type":"integer"},{"name":"x","type":"integer"},{"name":"z","type":"number"}],"primaryKey":["index"],"pandas_version":"0.20.
... 0"}, "data": [{"index":0,"v":0,"y":3,"v":0,"x":1,"z":null}]}', orient="table")
>>> f_(df_.shape[0], df_["x"].values, df_["y"].values, df_["z"].values)
>>> df_
v y v x z
0 0 3 0 1 NaN
Если дубликат удален, функция работает так, как ожидалось:
>>> df_.drop("v", axis="columns", inplace=True)
>>> f_(df_.shape[0], df_["x"].values, df_["y"].values, df_["z"].values)
>>> df_
y x z
0 3 1 3.0