Как я могу иметь разные типы в серии Pandas, если в серии Pandas используется numpy?

1

Насколько я знаю, элемент 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?

  • 0
    В объектном массиве dtype элементы сохраняют свой тип Python, str, int и т. Д. Как и в случае со списком, такой массив содержит указатели на объекты, хранящиеся в другом месте в памяти. Не путайте dtype и type .
Теги:
pandas
numpy

1 ответ

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

Связано: Строки в DataFrame, но dtype - объект

  • 0
    In general, Pandas dtype changes to accommodate values. Вы имеете в виду, что панды меняют тип Dndarray?
  • 0
    @KorayTugay, да. Или создает новый массив с другим типом dtype и присоединяет его к метке столбца / серии данных.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню