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

Почему Pandas говорит мне, что у меня есть объекты, хотя каждый элемент в выбранном столбце является строкой - даже после явного преобразования.

Это мой DataFrame:

<class 'pandas.core.frame.DataFrame'>
Int64Index: 56992 entries, 0 to 56991
Data columns (total 7 columns):
id            56992  non-null values
attr1         56992  non-null values
attr2         56992  non-null values
attr3         56992  non-null values
attr4         56992  non-null values
attr5         56992  non-null values
attr6         56992  non-null values
dtypes: int64(2), object(5)

Пять из них dtype object. Я явно конвертирую эти объекты в строки:

for c in df.columns:
    if df[c].dtype == object:
        print "convert ", df[c].name, " to string"
        df[c] = df[c].astype(str)

Тогда df["attr2"] все еще имеет dtype object, хотя type(df["attr2"].ix[0] показывает str, что правильно.

Pandas различает int64 и float64 и object. Какова его логика, когда нет dtype str? Почему str покрывается object?

Ответ 1

Объект dtype поступает из NumPy, он описывает тип элемента в ndarray. Каждый элемент в ndarray должен иметь одинаковый размер в байте. Для int64 и float64 они равны 8 байтам. Но для строк длина строки не фиксирована. Поэтому вместо сохранения байтов строк в ndarray напрямую, Pandas используйте объект ndarray, который сохраняет указатели на объекты, из-за этого dtype этого типа ndarray является объектом.

Вот пример:

  • массив int64 содержит 4 значения int64.
  • массив объектов содержит 4 указателя на 3 строковых объекта.

enter image description here

Ответ 2

Принятый ответ хорош. Просто хотел дать ответ, который ссылался на документацию. Документация гласит:

Панда использует объект dtype для хранения строк.

Как говорит ведущий комментарий: "Не беспокойся об этом; это должно быть так". (Хотя принятый ответ отлично справился с объяснением "почему"; строки переменной длины)

Но для строк длина строки не фиксирована.