Pandas 中文官檔~基礎(chǔ)用法6

呆鳥(niǎo)云:“這一系列長(zhǎng)篇終于連載完了,還請(qǐng)大家關(guān)注 Python 大咖談,這里專注 Python 數(shù)據(jù)分析垄琐,后期呆鳥(niǎo)還會(huì)給大家分享更多 Pandas 好文赠制÷赴冢”

數(shù)據(jù)類(lèi)型

大多數(shù)情況下,pandas 使用 Numpy 數(shù)組钟些、Series 或 DataFrame 里某列的數(shù)據(jù)類(lèi)型烟号。Numpy 支持 floatint政恍、bool汪拥、timedelta[ns]datetime64[ns]篙耗,注意迫筑,Numpy 不支持帶時(shí)區(qū)信息的 datetime

Pandas 與第三方支持庫(kù)對(duì) Numpy 類(lèi)型系統(tǒng)進(jìn)行了擴(kuò)充鹤树,本節(jié)只介紹 pandas 的內(nèi)部擴(kuò)展铣焊。如需了解自行編寫(xiě)與 pandas 配合的擴(kuò)展類(lèi)型,請(qǐng)參閱擴(kuò)展類(lèi)型罕伯,參閱擴(kuò)展數(shù)據(jù)類(lèi)型了解第三方支持庫(kù)提供的擴(kuò)展類(lèi)型曲伊。

下表列出了 pandas 擴(kuò)展類(lèi)型,參閱列出的文檔內(nèi)容,查看每種類(lèi)型的詳情坟募。

數(shù)據(jù)種類(lèi) 數(shù)據(jù)類(lèi)型 標(biāo)量 數(shù)組 文檔
帶時(shí)區(qū)的日期時(shí)間 DatetimeTZDtype Timestamp arrays.DatetimeArray Time zone handling
類(lèi)別型 CategoricalDtype (無(wú)) Categorical Categorical data
時(shí)間段 PeriodDtype Period arrays.PeriodArray Time span representation
稀疏型 SparseDtype (無(wú)) arrays.SparseArray Sparse data structures
時(shí)間間隔 IntervalDtype Interval arrays.IntervalArray IntervalIndex
空整型 Int64Dtype, … (無(wú)) arrays.IntegerArray Nullable integer data type

Pandas 用 object 存儲(chǔ)字符串岛蚤。

雖然,object 數(shù)據(jù)類(lèi)型能夠存儲(chǔ)任何對(duì)象懈糯,但應(yīng)盡量避免這種操作涤妒,要了解與其它支持庫(kù)與方法的性能與交互操作,參閱 對(duì)象轉(zhuǎn)換赚哗。

DataFrame 的 dtypes 屬性用起來(lái)很方便她紫,以 Series 形式返回每列的數(shù)據(jù)類(lèi)型。

In [328]: dft = pd.DataFrame({'A': np.random.rand(3),
   .....:                     'B': 1,
   .....:                     'C': 'foo',
   .....:                     'D': pd.Timestamp('20010102'),
   .....:                     'E': pd.Series([1.0] * 3).astype('float32'),
   .....:                     'F': False,
   .....:                     'G': pd.Series([1] * 3, dtype='int8')})
   .....: 

In [329]: dft
Out[329]: 
          A  B    C          D    E      F  G
0  0.035962  1  foo 2001-01-02  1.0  False  1
1  0.701379  1  foo 2001-01-02  1.0  False  1
2  0.281885  1  foo 2001-01-02  1.0  False  1

In [330]: dft.dtypes
Out[330]: 
A           float64
B             int64
C            object
D    datetime64[ns]
E           float32
F              bool
G              int8
dtype: object

要查看 Series 的數(shù)據(jù)類(lèi)型屿储,用 dtype 屬性贿讹。

In [331]: dft['A'].dtype
Out[331]: dtype('float64')

Pandas 對(duì)象單列中含多種類(lèi)型的數(shù)據(jù)時(shí),該列的數(shù)據(jù)類(lèi)型為可適配于各類(lèi)數(shù)據(jù)的數(shù)據(jù)類(lèi)型够掠,通常為 object民褂。

# 整數(shù)被強(qiáng)制轉(zhuǎn)換為浮點(diǎn)數(shù)
In [332]: pd.Series([1, 2, 3, 4, 5, 6.])
Out[332]: 
0    1.0
1    2.0
2    3.0
3    4.0
4    5.0
5    6.0
dtype: float64

# 字符串?dāng)?shù)據(jù)決定了該 Series 的數(shù)據(jù)類(lèi)型為 ``object``
In [333]: pd.Series([1, 2, 3, 6., 'foo'])
Out[333]: 
0      1
1      2
2      3
3      6
4    foo
dtype: object

DataFrame.dtypes.value_counts() 用于統(tǒng)計(jì) DataFrame 里各列數(shù)據(jù)類(lèi)型的數(shù)量。

In [334]: dft.dtypes.value_counts()
Out[334]: 
float32           1
object            1
bool              1
int8              1
float64           1
datetime64[ns]    1
int64             1
dtype: int64

多種數(shù)值型數(shù)據(jù)類(lèi)型可以在 DataFrame 里共存疯潭。如果只傳遞一種數(shù)據(jù)類(lèi)型赊堪,不論是通過(guò) dtype 關(guān)鍵字直接傳遞,還是通過(guò) ndarraySeries 傳遞竖哩,都會(huì)保存至 DataFrame 操作哭廉。此外,不同數(shù)值型數(shù)據(jù)類(lèi)型不會(huì)合并相叁。示例如下:

In [335]: df1 = pd.DataFrame(np.random.randn(8, 1), columns=['A'], dtype='float32')

In [336]: df1
Out[336]: 
          A
0  0.224364
1  1.890546
2  0.182879
3  0.787847
4 -0.188449
5  0.667715
6 -0.011736
7 -0.399073

In [337]: df1.dtypes
Out[337]: 
A    float32
dtype: object

In [338]: df2 = pd.DataFrame({'A': pd.Series(np.random.randn(8), dtype='float16'),
   .....:                     'B': pd.Series(np.random.randn(8)),
   .....:                     'C': pd.Series(np.array(np.random.randn(8),
   .....:                                             dtype='uint8'))})
   .....: 

In [339]: df2
Out[339]: 
          A         B    C
0  0.823242  0.256090    0
1  1.607422  1.426469    0
2 -0.333740 -0.416203  255
3 -0.063477  1.139976    0
4 -1.014648 -1.193477    0
5  0.678711  0.096706    0
6 -0.040863 -1.956850    1
7 -0.357422 -0.714337    0

In [340]: df2.dtypes
Out[340]: 
A    float16
B    float64
C      uint8
dtype: object

默認(rèn)值

整數(shù)的默認(rèn)類(lèi)型為 int64群叶,浮點(diǎn)數(shù)的默認(rèn)類(lèi)型為 float64,這里的默認(rèn)值與系統(tǒng)平臺(tái)無(wú)關(guān)钝荡,不管是 32 位系統(tǒng)街立,還是 64 位系統(tǒng)都是一樣的。下列代碼返回的結(jié)果都是 int64

In [341]: pd.DataFrame([1, 2], columns=['a']).dtypes
Out[341]: 
a    int64
dtype: object

In [342]: pd.DataFrame({'a': [1, 2]}).dtypes
Out[342]: 
a    int64
dtype: object

In [343]: pd.DataFrame({'a': 1}, index=list(range(2))).dtypes
Out[343]: 
a    int64
dtype: object

注意埠通,Numpy 創(chuàng)建數(shù)組時(shí)赎离,會(huì)根據(jù)系統(tǒng)選擇類(lèi)型。下列代碼在 32 位系統(tǒng)上返回 int32端辱。

In [344]: frame = pd.DataFrame(np.array([1, 2]))

向上轉(zhuǎn)型

與其它類(lèi)型合并時(shí)梁剔,要用到向上轉(zhuǎn)型,這里指的是從現(xiàn)有類(lèi)型轉(zhuǎn)換為另一種類(lèi)型舞蔽,如int 變?yōu)?float荣病。

In [345]: df3 = df1.reindex_like(df2).fillna(value=0.0) + df2

In [346]: df3
Out[346]: 
          A         B      C
0  1.047606  0.256090    0.0
1  3.497968  1.426469    0.0
2 -0.150862 -0.416203  255.0
3  0.724370  1.139976    0.0
4 -1.203098 -1.193477    0.0
5  1.346426  0.096706    0.0
6 -0.052599 -1.956850    1.0
7 -0.756495 -0.714337    0.0

In [347]: df3.dtypes
Out[347]: 
A    float32
B    float64
C    float64
dtype: object

DataFrame.to_numpy() 返回多個(gè)數(shù)據(jù)類(lèi)型里用的最多的數(shù)據(jù)類(lèi)型,這里指的是輸出結(jié)果的數(shù)據(jù)類(lèi)型是適用于所有同質(zhì) Numpy 數(shù)組的數(shù)據(jù)類(lèi)型渗柿。這里會(huì)強(qiáng)制執(zhí)行向上轉(zhuǎn)型个盆。

In [348]: df3.to_numpy().dtype
Out[348]: dtype('float64')

astype

astype() 方法顯式地把一種數(shù)據(jù)類(lèi)型轉(zhuǎn)換為另一種脖岛,默認(rèn)返回的是復(fù)制數(shù)據(jù),就算數(shù)據(jù)類(lèi)型沒(méi)有改變也會(huì)執(zhí)行復(fù)制操作颊亮,copy=False 可以改變默認(rèn)操作模式柴梆。此外,如果 astype 無(wú)效會(huì)觸發(fā)異常终惑。

向上轉(zhuǎn)型一般都會(huì)遵循 numpy 的規(guī)則绍在。如果操作中涉及兩種不同類(lèi)型的數(shù)據(jù),返回的將是更通用的那種數(shù)據(jù)類(lèi)型雹有。

In [349]: df3
Out[349]: 
          A         B      C
0  1.047606  0.256090    0.0
1  3.497968  1.426469    0.0
2 -0.150862 -0.416203  255.0
3  0.724370  1.139976    0.0
4 -1.203098 -1.193477    0.0
5  1.346426  0.096706    0.0
6 -0.052599 -1.956850    1.0
7 -0.756495 -0.714337    0.0

In [350]: df3.dtypes
Out[350]: 
A    float32
B    float64
C    float64
dtype: object

# 轉(zhuǎn)換數(shù)據(jù)類(lèi)型
In [351]: df3.astype('float32').dtypes
Out[351]: 
A    float32
B    float32
C    float32
dtype: object

astype() 把一列或多列轉(zhuǎn)換為指定類(lèi)型 偿渡。

In [352]: dft = pd.DataFrame({'a': [1, 2, 3], 'b': [4, 5, 6], 'c': [7, 8, 9]})

In [353]: dft[['a', 'b']] = dft[['a', 'b']].astype(np.uint8)

In [354]: dft
Out[354]: 
   a  b  c
0  1  4  7
1  2  5  8
2  3  6  9

In [355]: dft.dtypes
Out[355]: 
a    uint8
b    uint8
c    int64
dtype: object

0.19.0 版新增。

astype() 通過(guò)字典指定哪些列轉(zhuǎn)換為哪些類(lèi)型霸奕。

In [356]: dft1 = pd.DataFrame({'a': [1, 0, 1], 'b': [4, 5, 6], 'c': [7, 8, 9]})

In [357]: dft1 = dft1.astype({'a': np.bool, 'c': np.float64})

In [358]: dft1
Out[358]: 
       a  b    c
0   True  4  7.0
1  False  5  8.0
2   True  6  9.0

In [359]: dft1.dtypes
Out[359]: 
a       bool
b      int64
c    float64
dtype: object

::: tip 注意

astype()loc() 為部分列轉(zhuǎn)換指定類(lèi)型時(shí)卸察,會(huì)發(fā)生向上轉(zhuǎn)型。

loc() 嘗試分配當(dāng)前的數(shù)據(jù)類(lèi)型铅祸,而 [] 則會(huì)從右方獲取數(shù)據(jù)類(lèi)型并進(jìn)行覆蓋。因此合武,下列代碼會(huì)產(chǎn)出意料之外的結(jié)果:

In [360]: dft = pd.DataFrame({'a': [1, 2, 3], 'b': [4, 5, 6], 'c': [7, 8, 9]})

In [361]: dft.loc[:, ['a', 'b']].astype(np.uint8).dtypes
Out[361]: 
a    uint8
b    uint8
dtype: object

In [362]: dft.loc[:, ['a', 'b']] = dft.loc[:, ['a', 'b']].astype(np.uint8)

In [363]: dft.dtypes
Out[363]: 
a    int64
b    int64
c    int64
dtype: object

:::

對(duì)象轉(zhuǎn)換

Pandas 提供了多種函數(shù)可以把 object 從一種類(lèi)型強(qiáng)制轉(zhuǎn)為另一種類(lèi)型临梗。這是因?yàn)椋瑪?shù)據(jù)有時(shí)存儲(chǔ)的是正確類(lèi)型稼跳,但在保存時(shí)卻存成了 object 類(lèi)型盟庞,此時(shí),用 DataFrame.infer_objects()Series.infer_objects() 方法即可把數(shù)據(jù)轉(zhuǎn)換為正確的類(lèi)型汤善。

In [364]: import datetime

In [365]: df = pd.DataFrame([[1, 2],
   .....:                    ['a', 'b'],
   .....:                    [datetime.datetime(2016, 3, 2),
   .....:                     datetime.datetime(2016, 3, 2)]])
   .....: 

In [366]: df = df.T

In [367]: df
Out[367]: 
   0  1          2
0  1  a 2016-03-02
1  2  b 2016-03-02

In [368]: df.dtypes
Out[368]: 
0            object
1            object
2    datetime64[ns]
dtype: object

因?yàn)閿?shù)據(jù)被轉(zhuǎn)置什猖,所以把原始列的數(shù)據(jù)類(lèi)型改成了 object,但使用 infer_objects 后就變正確了红淡。

In [369]: df.infer_objects().dtypes
Out[369]: 
0             int64
1            object
2    datetime64[ns]
dtype: object

下列函數(shù)可以應(yīng)用于一維數(shù)組與標(biāo)量不狮,執(zhí)行硬轉(zhuǎn)換,把對(duì)象轉(zhuǎn)換為指定類(lèi)型在旱。

In [370]: m = ['1.1', 2, 3]

In [371]: pd.to_numeric(m)
Out[371]: array([1.1, 2. , 3. ])
In [372]: import datetime

In [373]: m = ['2016-07-09', datetime.datetime(2016, 3, 2)]

In [374]: pd.to_datetime(m)
Out[374]: DatetimeIndex(['2016-07-09', '2016-03-02'], dtype='datetime64[ns]', freq=None)
  • to_timedelta()桶蝎,轉(zhuǎn)換為 timedelta 對(duì)象驻仅。
In [375]: m = ['5us', pd.Timedelta('1day')]

In [376]: pd.to_timedelta(m)
Out[376]: TimedeltaIndex(['0 days 00:00:00.000005', '1 days 00:00:00'], dtype='timedelta64[ns]', freq=None)

如需強(qiáng)制轉(zhuǎn)換,則要加入 error 參數(shù)登渣,指定 pandas 怎樣處理不能轉(zhuǎn)換為成預(yù)期類(lèi)型或?qū)ο蟮臄?shù)據(jù)噪服。errors 參數(shù)的默認(rèn)值為 False,指的是在轉(zhuǎn)換過(guò)程中胜茧,遇到任何問(wèn)題都觸發(fā)錯(cuò)誤粘优。設(shè)置為 errors='coerce' 時(shí),pandas 會(huì)忽略錯(cuò)誤,強(qiáng)制把問(wèn)題數(shù)據(jù)轉(zhuǎn)換為 pd.NaTdatetimetimedelta)敬飒,或 np.nan(數(shù)值型)邪铲。讀取數(shù)據(jù)時(shí),如果大部分要轉(zhuǎn)換的數(shù)據(jù)是數(shù)值型或 datetime无拗,這種操作非常有用带到,但偶爾也會(huì)有非制式數(shù)據(jù)混合在一起,可能會(huì)導(dǎo)致展示數(shù)據(jù)缺失:

In [377]: import datetime

In [378]: m = ['apple', datetime.datetime(2016, 3, 2)]

In [379]: pd.to_datetime(m, errors='coerce')
Out[379]: DatetimeIndex(['NaT', '2016-03-02'], dtype='datetime64[ns]', freq=None)

In [380]: m = ['apple', 2, 3]

In [381]: pd.to_numeric(m, errors='coerce')
Out[381]: array([nan,  2.,  3.])

In [382]: m = ['apple', pd.Timedelta('1day')]

In [383]: pd.to_timedelta(m, errors='coerce')
Out[383]: TimedeltaIndex([NaT, '1 days'], dtype='timedelta64[ns]', freq=None)

error 參數(shù)還有第三個(gè)選項(xiàng)英染,error='ignore'揽惹。轉(zhuǎn)換數(shù)據(jù)時(shí)會(huì)忽略錯(cuò)誤,直接輸出問(wèn)題數(shù)據(jù):

In [384]: import datetime

In [385]: m = ['apple', datetime.datetime(2016, 3, 2)]

In [386]: pd.to_datetime(m, errors='ignore')
Out[386]: Index(['apple', 2016-03-02 00:00:00], dtype='object')

In [387]: m = ['apple', 2, 3]

In [388]: pd.to_numeric(m, errors='ignore')
Out[388]: array(['apple', 2, 3], dtype=object)

In [389]: m = ['apple', pd.Timedelta('1day')]

In [390]: pd.to_timedelta(m, errors='ignore')
Out[390]: array(['apple', Timedelta('1 days 00:00:00')], dtype=object)

執(zhí)行轉(zhuǎn)換操作時(shí)四康,to_numeric() 還有一個(gè)參數(shù)搪搏,downcast,即向下轉(zhuǎn)型闪金,可以把數(shù)值型轉(zhuǎn)換為減少內(nèi)存占用的數(shù)據(jù)類(lèi)型:

In [391]: m = ['1', 2, 3]

In [392]: pd.to_numeric(m, downcast='integer')   # smallest signed int dtype
Out[392]: array([1, 2, 3], dtype=int8)

In [393]: pd.to_numeric(m, downcast='signed')    # same as 'integer'
Out[393]: array([1, 2, 3], dtype=int8)

In [394]: pd.to_numeric(m, downcast='unsigned')  # smallest unsigned int dtype
Out[394]: array([1, 2, 3], dtype=uint8)

In [395]: pd.to_numeric(m, downcast='float')     # smallest float dtype
Out[395]: array([1., 2., 3.], dtype=float32)

上述方法僅能應(yīng)用于一維數(shù)組疯溺、列表或標(biāo)量;不能直接用于 DataFrame 等多維對(duì)象哎垦。不過(guò)囱嫩,用 apply(),可以快速為每列應(yīng)用函數(shù):

In [396]: import datetime

In [397]: df = pd.DataFrame([
   .....:     ['2016-07-09', datetime.datetime(2016, 3, 2)]] * 2, dtype='O')
   .....: 

In [398]: df
Out[398]: 
            0                    1
0  2016-07-09  2016-03-02 00:00:00
1  2016-07-09  2016-03-02 00:00:00

In [399]: df.apply(pd.to_datetime)
Out[399]: 
           0          1
0 2016-07-09 2016-03-02
1 2016-07-09 2016-03-02

In [400]: df = pd.DataFrame([['1.1', 2, 3]] * 2, dtype='O')

In [401]: df
Out[401]: 
     0  1  2
0  1.1  2  3
1  1.1  2  3

In [402]: df.apply(pd.to_numeric)
Out[402]: 
     0  1  2
0  1.1  2  3
1  1.1  2  3

In [403]: df = pd.DataFrame([['5us', pd.Timedelta('1day')]] * 2, dtype='O')

In [404]: df
Out[404]: 
     0                1
0  5us  1 days 00:00:00
1  5us  1 days 00:00:00

In [405]: df.apply(pd.to_timedelta)
Out[405]: 
                0      1
0 00:00:00.000005 1 days
1 00:00:00.000005 1 days

各種坑

對(duì) integer 數(shù)據(jù)執(zhí)行選擇操作時(shí)漏设,可以很輕而易舉地把數(shù)據(jù)轉(zhuǎn)換為 floating 墨闲。pandas 會(huì)保存輸入數(shù)據(jù)的數(shù)據(jù)類(lèi)型,以防未引入 nans 的情況郑口。參閱 對(duì)整數(shù) NA 空值的支持鸳碧。

In [406]: dfi = df3.astype('int32')

In [407]: dfi['E'] = 1

In [408]: dfi
Out[408]: 
   A  B    C  E
0  1  0    0  1
1  3  1    0  1
2  0  0  255  1
3  0  1    0  1
4 -1 -1    0  1
5  1  0    0  1
6  0 -1    1  1
7  0  0    0  1

In [409]: dfi.dtypes
Out[409]: 
A    int32
B    int32
C    int32
E    int64
dtype: object

In [410]: casted = dfi[dfi > 0]

In [411]: casted
Out[411]: 
     A    B      C  E
0  1.0  NaN    NaN  1
1  3.0  1.0    NaN  1
2  NaN  NaN  255.0  1
3  NaN  1.0    NaN  1
4  NaN  NaN    NaN  1
5  1.0  NaN    NaN  1
6  NaN  NaN    1.0  1
7  NaN  NaN    NaN  1

In [412]: casted.dtypes
Out[412]: 
A    float64
B    float64
C    float64
E      int64
dtype: object

浮點(diǎn)數(shù)類(lèi)型未改變。

In [413]: dfa = df3.copy()

In [414]: dfa['A'] = dfa['A'].astype('float32')

In [415]: dfa.dtypes
Out[415]: 
A    float32
B    float64
C    float64
dtype: object

In [416]: casted = dfa[df2 > 0]

In [417]: casted
Out[417]: 
          A         B      C
0  1.047606  0.256090    NaN
1  3.497968  1.426469    NaN
2       NaN       NaN  255.0
3       NaN  1.139976    NaN
4       NaN       NaN    NaN
5  1.346426  0.096706    NaN
6       NaN       NaN    1.0
7       NaN       NaN    NaN

In [418]: casted.dtypes
Out[418]: 
A    float32
B    float64
C    float64
dtype: object

基于 dtype 選擇列

select_dtypes() 方法基于 dtype 選擇列犬性。

首先瞻离,創(chuàng)建一個(gè)由多種數(shù)據(jù)類(lèi)型組成的 DataFrame:

In [419]: df = pd.DataFrame({'string': list('abc'),
   .....:                    'int64': list(range(1, 4)),
   .....:                    'uint8': np.arange(3, 6).astype('u1'),
   .....:                    'float64': np.arange(4.0, 7.0),
   .....:                    'bool1': [True, False, True],
   .....:                    'bool2': [False, True, False],
   .....:                    'dates': pd.date_range('now', periods=3),
   .....:                    'category': pd.Series(list("ABC")).astype('category')})
   .....: 

In [420]: df['tdeltas'] = df.dates.diff()

In [421]: df['uint64'] = np.arange(3, 6).astype('u8')

In [422]: df['other_dates'] = pd.date_range('20130101', periods=3)

In [423]: df['tz_aware_dates'] = pd.date_range('20130101', periods=3, tz='US/Eastern')

In [424]: df
Out[424]: 
  string  int64  uint8  float64  bool1  bool2                      dates category tdeltas  uint64 other_dates            tz_aware_dates
0      a      1      3      4.0   True  False 2019-08-22 15:49:01.870038        A     NaT       3  2013-01-01 2013-01-01 00:00:00-05:00
1      b      2      4      5.0  False   True 2019-08-23 15:49:01.870038        B  1 days       4  2013-01-02 2013-01-02 00:00:00-05:00
2      c      3      5      6.0   True  False 2019-08-24 15:49:01.870038        C  1 days       5  2013-01-03 2013-01-03 00:00:00-05:00

該 DataFrame 的數(shù)據(jù)類(lèi)型:

In [425]: df.dtypes
Out[425]: 
string                                object
int64                                  int64
uint8                                  uint8
float64                              float64
bool1                                   bool
bool2                                   bool
dates                         datetime64[ns]
category                            category
tdeltas                      timedelta64[ns]
uint64                                uint64
other_dates                   datetime64[ns]
tz_aware_dates    datetime64[ns, US/Eastern]
dtype: object

select_dtypes() 有兩個(gè)參數(shù),includeexclude乒裆,用于實(shí)現(xiàn)“提取這些數(shù)據(jù)類(lèi)型的列” (include)或 “提取不是這些數(shù)據(jù)類(lèi)型的列”(exclude)琐脏。

選擇 bool 型的列,示例如下:

In [426]: df.select_dtypes(include=[bool])
Out[426]: 
   bool1  bool2
0   True  False
1  False   True
2   True  False

該方法還支持輸入 NumPy 數(shù)據(jù)類(lèi)型的名稱:

In [427]: df.select_dtypes(include=['bool'])
Out[427]: 
   bool1  bool2
0   True  False
1  False   True
2   True  False

select_dtypes() 還支持通用數(shù)據(jù)類(lèi)型缸兔。

比如日裙,選擇所有數(shù)值型與布爾型的列,同時(shí)惰蜜,排除無(wú)符號(hào)整數(shù):

In [428]: df.select_dtypes(include=['number', 'bool'], exclude=['unsignedinteger'])
Out[428]: 
   int64  float64  bool1  bool2 tdeltas
0      1      4.0   True  False     NaT
1      2      5.0  False   True  1 days
2      3      6.0   True  False  1 days

選擇字符串型的列必須要用 object

In [429]: df.select_dtypes(include=['object'])
Out[429]: 
  string
0      a
1      b
2      c

要查看 numpy.number 等通用 dtype 的所有子類(lèi)型昂拂,可以定義一個(gè)函數(shù),返回子類(lèi)型樹(shù):

In [430]: def subdtypes(dtype):
   .....:     subs = dtype.__subclasses__()
   .....:     if not subs:
   .....:         return dtype
   .....:     return [dtype, [subdtypes(dt) for dt in subs]]
   .....: 

所有 Numpy 數(shù)據(jù)類(lèi)型都是 numpy.generic 的子類(lèi):

In [431]: subdtypes(np.generic)
Out[431]: 
[numpy.generic,
 [[numpy.number,
   [[numpy.integer,
     [[numpy.signedinteger,
       [numpy.int8,
        numpy.int16,
        numpy.int32,
        numpy.int64,
        numpy.int64,
        numpy.timedelta64]],
      [numpy.unsignedinteger,
       [numpy.uint8,
        numpy.uint16,
        numpy.uint32,
        numpy.uint64,
        numpy.uint64]]]],
    [numpy.inexact,
     [[numpy.floating,
       [numpy.float16, numpy.float32, numpy.float64, numpy.float128]],
      [numpy.complexfloating,
       [numpy.complex64, numpy.complex128, numpy.complex256]]]]]],
  [numpy.flexible,
   [[numpy.character, [numpy.bytes_, numpy.str_]],
    [numpy.void, [numpy.record]]]],
  numpy.bool_,
  numpy.datetime64,
  numpy.object_]]

::: tip 注意

Pandas 支持 categorydatetime64[ns, tz] 類(lèi)型抛猖,但這兩種類(lèi)型未整合到 Numpy 的架構(gòu)里格侯,因此鼻听,上面的函數(shù)沒(méi)有顯示。

:::

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末联四,一起剝皮案震驚了整個(gè)濱河市撑碴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌朝墩,老刑警劉巖醉拓,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異收苏,居然都是意外死亡亿卤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)鹿霸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)排吴,“玉大人,你說(shuō)我怎么就攤上這事懦鼠∽炅ǎ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵肛冶,是天一觀的道長(zhǎng)街氢。 經(jīng)常有香客問(wèn)我,道長(zhǎng)淑趾,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任忧陪,我火速辦了婚禮扣泊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嘶摊。我一直安慰自己延蟹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布叶堆。 她就那樣靜靜地躺著阱飘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪虱颗。 梳的紋絲不亂的頭發(fā)上沥匈,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音忘渔,去河邊找鬼高帖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛畦粮,可吹牛的內(nèi)容都是我干的散址。 我是一名探鬼主播乖阵,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼预麸!你這毒婦竟也來(lái)了瞪浸?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤吏祸,失蹤者是張志新(化名)和其女友劉穎对蒲,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體犁罩,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡齐蔽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了床估。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片含滴。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖丐巫,靈堂內(nèi)的尸體忽然破棺而出谈况,到底是詐尸還是另有隱情,我是刑警寧澤递胧,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布碑韵,位于F島的核電站,受9級(jí)特大地震影響缎脾,放射性物質(zhì)發(fā)生泄漏祝闻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一遗菠、第九天 我趴在偏房一處隱蔽的房頂上張望联喘。 院中可真熱鬧,春花似錦辙纬、人聲如沸豁遭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蓖谢。三九已至,卻和暖如春譬涡,著一層夾襖步出監(jiān)牢的瞬間闪幽,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工涡匀, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沟使,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓渊跋,卻偏偏與公主長(zhǎng)得像腊嗡,于是被迫代替她去往敵國(guó)和親着倾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容