Pandas Nullable整形數(shù)據(jù)類型

2020-04-07 10:57 更新
Nullable整型數(shù)據(jù)類型

在0.24.0版本中新引入

小貼士

IntegerArray目前屬于實(shí)驗(yàn)性階段,因此他的API或者使用方式可能會(huì)在沒有提示的情況下更改。

在 處理丟失的數(shù)據(jù)部分, 我們知道pandas主要使用 NaN 來代表丟失數(shù)據(jù)。因?yàn)?nbsp;NaN 屬于浮點(diǎn)型數(shù)據(jù),這強(qiáng)制有缺失值的整型array強(qiáng)制轉(zhuǎn)換成浮點(diǎn)型。在某些情況下,這可能不會(huì)有太大影響,但是如果你的整型數(shù)據(jù)恰好是標(biāo)識(shí)符,數(shù)據(jù)類型的轉(zhuǎn)換可能會(huì)存在隱患。同時(shí),某些整數(shù)無法使用浮點(diǎn)型來表示。

Pandas能夠?qū)⒖赡艽嬖谌笔е档恼蛿?shù)據(jù)使用arrays.IntegerArra來表示。這是pandas中內(nèi)置的 擴(kuò)展方式它并不是整型數(shù)據(jù)組成array對(duì)象的默認(rèn)方式,并且并不會(huì)被pandas直接使用。因此,如果你希望生成這種數(shù)據(jù)類型,你需要在生成array()或者 Series,在dtype變量中直接指定。

In [1]: arr = pd.array([1, 2, np.nan], dtype=pd.Int64Dtype())

In [2]: arr
Out[2]: 
<IntegerArray>
[1, 2, NaN]
Length: 3, dtype: Int64

或者使用字符串"Int64"(注意此處的 "I"需要大寫,以此和NumPy中的'int64'數(shù)據(jù)類型作出區(qū)別):

In [3]: pd.array([1, 2, np.nan], dtype="Int64")
Out[3]: 
<IntegerArray>
[1, 2, NaN]
Length: 3, dtype: Int64

這樣的array對(duì)象與NumPy的array對(duì)象類似,可以被存放在DataFrame或 Series。

In [4]: pd.Series(arr)
Out[4]: 
0      1
1      2
2    NaN
dtype: Int64

你也可以直接將列表形式的數(shù)據(jù)直接傳入Series,并指明dtype。

In [5]: s = pd.Series([1, 2, np.nan], dtype="Int64")

In [6]: s
Out[6]: 
0      1
1      2
2    NaN
dtype: Int64

默認(rèn)情況下(如果你不指明dtype),則會(huì)使用NumPy來構(gòu)建這個(gè)數(shù)據(jù),最終你會(huì)得到float64類型的Series:

In [7]: pd.Series([1, 2, np.nan])
Out[7]: 
0    1.0
1    2.0
2    NaN
dtype: float64

對(duì)使用了整型array的操作與對(duì)NumPy中array的操作類似,缺失值會(huì)被繼承并保留原本的數(shù)據(jù)類型,但在必要的情況下,數(shù)據(jù)類型也會(huì)發(fā)生轉(zhuǎn)變。

# 運(yùn)算
In [8]: s + 1
Out[8]: 
0      2
1      3
2    NaN
dtype: Int64

# 比較
In [9]: s == 1
Out[9]: 
0     True
1    False
2    False
dtype: bool

# 索引
In [10]: s.iloc[1:3]
Out[10]: 
1      2
2    NaN
dtype: Int64

# 和其他數(shù)據(jù)類型聯(lián)合使用
In [11]: s + s.iloc[1:3].astype('Int8')
Out[11]: 
0    NaN
1      4
2    NaN
dtype: Int64

# 在必要情況下,數(shù)據(jù)類型發(fā)生轉(zhuǎn)變
In [12]: s + 0.01
Out[12]: 
0    1.01
1    2.01
2     NaN
dtype: float64

這種數(shù)據(jù)類型可以作為 DataFrame的一部分進(jìn)行使用。

In [13]: df = pd.DataFrame({'A': s, 'B': [1, 1, 3], 'C': list('aab')})

In [14]: df
Out[14]: 
     A  B  C
0    1  1  a
1    2  1  a
2  NaN  3  b

In [15]: df.dtypes
Out[15]: 
A     Int64
B     int64
C    object
dtype: object

這種數(shù)據(jù)類型也可以在合并(merge)、重構(gòu)(reshape)和類型轉(zhuǎn)換(cast)。

In [16]: pd.concat([df[['A']], df[['B', 'C']]], axis=1).dtypes
Out[16]: 
A     Int64
B     int64
C    object
dtype: object

In [17]: df['A'].astype(float)
Out[17]: 
0    1.0
1    2.0
2    NaN
Name: A, dtype: float64

類似于求和的降維和分組操作也能正常使用。

In [18]: df.sum()
Out[18]: 
A      3
B      5
C    aab
dtype: object

In [19]: df.groupby('B').A.sum()
Out[19]: 
B
1    3
3    0
Name: A, dtype: Int64


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)