dtype ('O') ในหมีแพนด้าคืออะไร?


107

ฉันมีดาต้าเฟรมเป็นหมีแพนด้าและฉันกำลังพยายามหาว่าค่าของมันคืออะไร ฉันไม่แน่ใจว่าประเภทของคอลัมน์'Test'คืออะไร อย่างไรก็ตามเมื่อฉันวิ่งmyFrame['Test'].dtypeฉันได้รับ;

dtype('O')

สิ่งนี้หมายความว่า?


9
pandasใช้objectdtype ได้อย่างอิสระเมื่อคอลัมน์มีค่าผสม (สตริงตัวเลขนาโน)
hpaulj

@quant มันหมายถึงสตริงแพนด้าเหมือนที่ฉันพยายามชี้ในคำตอบ
prosti

คำตอบ:


109

หมายความว่า:

'O'     (Python) objects

แหล่ง

อักขระตัวแรกระบุชนิดของข้อมูลและอักขระที่เหลือระบุจำนวนไบต์ต่อไอเท็มยกเว้น 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


19

เมื่อคุณเห็นdtype('O')ภายใน dataframe นั่นหมายถึงสตริง 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')

คุณสามารถตีความสิ่งสุดท้ายเป็นdtype('O')วัตถุ Pandas หรือ Pandas ซึ่งเป็นสตริงประเภท Python และสิ่งนี้สอดคล้องกับ Numpy string_หรือunicode_ประเภท

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

เช่นเดียวกับที่ Don Quixote กำลังทำงานอยู่ Pandas อยู่บน Numpy และ Numpy เข้าใจสถาปัตยกรรมพื้นฐานของระบบของคุณและใช้คลาส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)

บรรทัดสุดท้ายจะตรวจสอบ dataframe และบันทึกผลลัพธ์:

   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และเพื่อให้ทราบที่นี่ถ้าเราตั้งสตริงภายในคอลัมน์สตริงไม่ใช่มันจะกลายเป็นสตริงหรือวัตถุ


14

หมายความว่า "วัตถุ python" กล่าวคือไม่ใช่ประเภทสเกลาร์ builtin ที่สนับสนุนโดย numpy

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

6

'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')

บรรทัดที่มีคำสั่งพิมพ์จะส่งกลับสิ่งต่อไปนี้: object

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.