Как я могу иметь разные типы в серии Pandas, если в серии Pandas используется numpy? - PullRequest
0 голосов
/ 01 сентября 2018

Насколько я знаю, элемент 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 - object, как получается, что int возвращается для элемента с индексом loc 1?

1 Ответ

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

Серия object dtype состоит из указателей на произвольные объекты Python. Подумайте о object dtype так же, как вы могли бы составить список Python. Например, список Python ['foo', 1] не хранит значения в непрерывном блоке памяти.

Таким же образом вы не можете прикрепить определенный тип данных к list, даже если все элементы одного типа, серия Pandas object содержит указатели на любое количество типов .

Как правило, тип dand для Pandas изменяется на , вмещая значения. Таким образом, добавление значения с плавающей точкой к целому ряду превратит весь ряд в 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

Related: Строки в DataFrame, но dtype - это объект

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...