Насколько я знаю, элемент numpys ndarrays должен быть одного типа, а серия pandas использует ndarray для хранения значений. Но мне кажется, что я могу добавить целое число в серию, содержащую строку.
Пример кода у меня есть..
import pandas as pd
sr = pd.Series(['foo'])
sr = sr.append(pd.Series([1], index=[1]))
print(type(sr.values))
print(sr.values.dtype)
print(type(sr.iloc[0]))
print(type(sr.iloc[1]))
и выход:
<class 'numpy.ndarray'>
object
<class 'str'>
<class 'int'>
Если тип ndarrays является объектом, то как возвращается int для элемента в index loc 1?
Серия dtype object
состоит из указателей на произвольные объекты Python. Подумайте об object
dtype так же, как и список Python. Например, список Python ['foo', 1]
не сохраняет значения в смежном блоке памяти.
Точно так же вы не можете присоединить определенный тип данных для list
, даже если все элементы одного типа, серия object
Pandas содержит указатели на любое количество типов.
В общем, Pandas dtype изменяется для размещения значений. Таким образом, добавление значения float в целую серию превратит целую серию в float
. Добавление строки в числовую строку заставит серию object
. Вы даже можете заставить числовую серию иметь object
dtype, хотя это не рекомендуется:
s = pd.Series(list(range(100000)), dtype=object)
Основное преимущество Pandas, то есть векторных вычислений, теряется, как только вы начинаете использовать серию object
. Их следует избегать, когда это возможно. Например, вы можете использовать pd.Categorical
для категорий факторизации, если это применимо.
Вот тривиальный пример, демонстрирующий падение производительности:
t = pd.Series(list(range(100000)))
%timeit s*10 # 7.31 ms
%timeit t*10 # 366 µs
In general, Pandas dtype changes to accommodate values.
Вы имеете в виду, что панды меняют тип Dndarray?
dtype
иtype
.