pandas 的 dtype (‘O’)是什么?

我在 pandas 上建立了一个 dataframe,我试图找出它的 values 类型。我不确定 'Test'列的类型。但是,当我运行 myFrame['Test'].dtype时,我得到;

dtype('O')

这是什么意思?

214958 次浏览

意思是:

'O'     (Python) objects

来源

第一个字符指定数据类型,其余字符指定每个项的字节数(Unicode 除外,Unicode 将其解释为字符数)。项目大小必须与现有类型相对应,否则将引发错误。受资助的种类包括 支持的类型包括:

'b'       boolean
'i'       (signed) integer
'u'       unsigned integer
'f'       floating-point
'c'       complex-floating point
'O'       (Python) objects
'S', 'a'  (byte-)string
'U'       Unicode
'V'       raw data (void)

另一个 回答有助于如果需要检查 types。

它的意思是“一个 python 对象”,即不是 numpy 支持的内置标量类型之一。

np.array([object()]).dtype
=> dtype('O')

O 代表 对象

#Loading a csv file as a dataframe
import pandas as pd
train_df = pd.read_csv('train.csv')
col_name = 'Name of Employee'


#Checking the datatype of column name
train_df[col_name].dtype


#Instead try printing the same thing
print train_df[col_name].dtype

第一行返回: dtype('O')

具有 print 语句的行返回以下内容: object

当你看到 dtype('O')在数据帧中,这意味着熊猫字符串。

什么是 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 类型字符串,这对应于 Numpy string_unicode_类型。

Pandas dtype    Python type     NumPy type          Usage
object          str             string_, unicode_   Text

就像堂吉诃德是在屁股上,熊猫是在麻木和麻木了解你的系统的底层架构,并使用类 numpy.dtype的。

数据类型对象是 numpy.dtype类的一个实例,它理解数据类型 更精确,包括:

  • 数据类型(整数、浮点数、 Python 对象等)
  • 数据的大小(例如整数的字节数)
  • 数据的字节顺序(little-endian 或 big-endian)
  • 如果数据类型是结构化的,则为其他数据类型的聚合(例如,描述由整数和浮点数组成的数组项)
  • 结构的“字段”的名称是什么
  • 每个字段的数据类型是什么
  • 每个字段占用内存块的哪个部分
  • 如果数据类型是子数组,那么它的形状和数据类型是什么

在这个问题的上下文中,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.nanNone,这将不会影响原来的列 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.nanNone,否则 np.nanNone不会改变列 dtype。在这种情况下,列将分别成为 float64object

您也可以尝试设置单行:

df.iloc[3,:] = 0 # will convert datetime to object only
df.iloc[4,:] = '' # will convert all columns to object

这里需要注意的是,如果我们在一个非字符串列中设置字符串,它将变成字符串或者对象 dtype