[英]ERROR: Expected 'Id' column to be of type 'Int32', but was 'String'
[英]Changing a dataframe column type to int32
我正在嘗試將 dataframe 列從 Python 傳遞給 Cython:
Python代碼
evaluate_c(
AnimalLogicPy(data[COL_ANIMAL_ID].values,
data[COL_ANIMAL_POWER].values,
)
賽通代碼
cpdef void evaluate_c(
int[:] animal_ids,
int[:] animal_power,
):
在 Python 端data[COL_ANIMAL_ID]
和data[COL_ANIMAL_POWER]
的類型為:int64
但是我收到以下錯誤:
ValueError: Buffer dtype mismatch, expected 'int' but got 'long'
我想在 Cython 中使用int
值。 我做了一些閱讀,我認為這是因為有問題的 dataframe 列的類型是int64
,我認為它正在變得很長,應該是int32
。
我曾嘗試在 Python 端使用以下方法更改類型:
data.astype({COL_ANIMAL_ID: 'int32'}).dtypes
data.astype({COL_ANIMAL_POWER: 'int32'}).dtypes
但我仍然得到 ValueError。
如何將 Python 端的列類型從 int64 更改為 int32?
您可以將其轉換為具有正確dtype
的 NumPy 數組。
有多種方法可以實現這一點,其中最直接的是通過.to_numpy()
方法:
data[COL_ANIMAL_ID].to_numpy('int32')
為了給你一個最小的工作示例,讓我們假設我們有以下 Cython function(為簡單起見,使用 IPython 的 Cython 魔法編譯):
%%cython -c-O3 -c-march=native -a
#cython: language_level=3, boundscheck=False, wraparound=False, initializedcheck=False, cdivision=True, infer_types=True
cpdef int summer(int [:] data, int n):
cdef int result = 0
for i in range(n):
result += data[i]
return result
然后下面的代碼工作:
import pandas as pd
import numpy as np
np.random.seed(0)
df = pd.DataFrame(np.random.randint(0, 100, (3, 4)))
print(df)
# 0 1 2 3
# 0 44 47 64 67
# 1 67 9 83 21
# 2 36 87 70 88
arr = np.array(df[0], dtype=np.int32)
print(summer(arr, arr.size)) # the array is fed to the Cython func
# 147
print(summer(df[0].values.astype(np.int32), df[0].size)) # directly from the Pandas's series
# 147
print(summer(df[0].to_numpy(dtype=np.int32), df[0].size)) # even more concisely
# 147
print(df[0].sum()) # checking that the result is correct
# 147
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.