У меня есть dataframe в пандах, и я пытаюсь выяснить, каковы типы его значений. Я не уверен, что тип столбца 'Test'
. Однако, когда я запускаю myFrame['Test'].dtype
, я получаю;
Ответ 4
Когда вы видите dtype('O')
внутри фрейма данных, это означает строку Pandas.
Что такое dtype
?
Что-то, что принадлежит pandas
или numpy
, или обоим, или что-то еще? Если мы рассмотрим код панд:
df = pd.DataFrame({'float': [1.0],
'int': [1],
'datetime': [pd.Timestamp('20180310')],
'string': ['foo']})
print(df)
print(df['float'].dtype,df['int'].dtype,df['datetime'].dtype,df['string'].dtype)
df['string'].dtype
Это выведет как это:
float int datetime string
0 1.0 1 2018-03-10 foo
---
float64 int64 datetime64[ns] object
---
dtype('O')
Вы можете интерпретировать последний как Pandas dtype('O')
или объект Pandas, который является строкой типа Python, и это соответствует типам string_
или unicode_
.
Pandas dtype Python type NumPy type Usage
object str string_, unicode_ Text
Как Дон Кихот на заднице, Пандас на Numpy, а Numpy понимает основную архитектуру вашей системы и использует для этого класс numpy.dtype
.
Объект типа данных является экземпляром класса numpy.dtype
который более точно понимает тип данных, включая:
- Тип данных (целое число, число с плавающей точкой, объект Python и т.д.)
- Размер данных (сколько байтов содержится, например, в целых числах)
- Порядок байтов данных (с прямым или прямым порядком байтов)
- Если тип данных структурирован, совокупность других типов данных (например, описание элемента массива, состоящего из целого числа и числа с плавающей запятой)
- Как называются "поля" структуры
- Каков тип данных каждого поля
- Какую часть блока памяти занимает каждое поле
- Если тип данных является подмассивом, какова его форма и тип данных
В контексте этого вопроса dtype
относится как к pands, так и к numpy, и, в частности, dtype('O')
означает, что мы ожидаем строку.
Вот некоторый код для тестирования с объяснением: Если у нас есть набор данных в качестве словаря
import pandas as pd
import numpy as np
from pandas import Timestamp
data={'id': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5}, 'date': {0: Timestamp('2018-12-12 00:00:00'), 1: Timestamp('2018-12-12 00:00:00'), 2: Timestamp('2018-12-12 00:00:00'), 3: Timestamp('2018-12-12 00:00:00'), 4: Timestamp('2018-12-12 00:00:00')}, 'role': {0: 'Support', 1: 'Marketing', 2: 'Business Development', 3: 'Sales', 4: 'Engineering'}, 'num': {0: 123, 1: 234, 2: 345, 3: 456, 4: 567}, 'fnum': {0: 3.14, 1: 2.14, 2: -0.14, 3: 41.3, 4: 3.14}}
df = pd.DataFrame.from_dict(data) #now we have a dataframe
print(df)
print(df.dtypes)
Последние строки проверят информационный кадр и отметят вывод:
id date role num fnum
0 1 2018-12-12 Support 123 3.14
1 2 2018-12-12 Marketing 234 2.14
2 3 2018-12-12 Business Development 345 -0.14
3 4 2018-12-12 Sales 456 41.30
4 5 2018-12-12 Engineering 567 3.14
id int64
date datetime64[ns]
role object
num int64
fnum float64
dtype: object
Все виды разных dtypes
df.iloc[1,:] = np.nan
df.iloc[2,:] = None
Но если мы попытаемся установить np.nan
или None
это не повлияет на исходный столбец dtype. Вывод будет таким:
print(df)
print(df.dtypes)
id date role num fnum
0 1.0 2018-12-12 Support 123.0 3.14
1 NaN NaT NaN NaN NaN
2 NaN NaT None NaN NaN
3 4.0 2018-12-12 Sales 456.0 41.30
4 5.0 2018-12-12 Engineering 567.0 3.14
id float64
date datetime64[ns]
role object
num float64
fnum float64
dtype: object
Поэтому np.nan
или None
не изменят столбцы dtype
, если мы не установим для всех строк столбцов значение np.nan
или None
. В этом случае столбец станет float64
или object
соответственно.
Вы также можете попробовать установить отдельные строки:
df.iloc[3,:] = 0 # will convert datetime to object only
df.iloc[4,:] = '' # will convert all columns to object
И обратите внимание, что если мы установим строку внутри dtype
столбца, она станет строкой или объектом dtype
.