呆鳥(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 支持 float
、int
政恍、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ò) ndarray
或 Series
傳遞竖哩,都會(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)型在旱。
-
to_numeric()
摇零,轉(zhuǎn)換為數(shù)值型
In [370]: m = ['1.1', 2, 3]
In [371]: pd.to_numeric(m)
Out[371]: array([1.1, 2. , 3. ])
-
to_datetime()
,轉(zhuǎn)換為datetime
對(duì)象
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.NaT
(datetime
與 timedelta
)敬飒,或 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ù),include
與 exclude
乒裆,用于實(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 支持 category
與 datetime64[ns, tz]
類(lèi)型抛猖,但這兩種類(lèi)型未整合到 Numpy 的架構(gòu)里格侯,因此鼻听,上面的函數(shù)沒(méi)有顯示。
:::