數據類型是電腦編程中將不同類型的數據值分類和定義的方式。 通過數據類型,可以確定數據的存儲方式和記憶體占用量,瞭解不同類型的數據進行各種運算的能力。 使用`pandas`進行數據分析時,最常用到的幾種類型是: 1. 字元串類型,各類文本內容都是字元串類型 2. 數值類型,包括整數和浮點數,可用於計算 ...
數據類型是電腦編程中將不同類型的數據值分類和定義的方式。
通過數據類型,可以確定數據的存儲方式和記憶體占用量,瞭解不同類型的數據進行各種運算的能力。
使用pandas
進行數據分析時,最常用到的幾種類型是:
- 字元串類型,各類文本內容都是字元串類型
- 數值類型,包括整數和浮點數,可用於計算
- 日期類型,日期在統計中非常重要,相關內容放在下一篇單獨介紹
category
類型,這個類型對於數據分類非常有用
1. 字元串類型
pandas
字元串類型主要用於處理文本數據或包含文本數據的列。
它可以快速、方便地對文本數據進行操作,比如:
- 字元串連接、分割、替換、提取等操作,例如將多個字元串合併成一個、將字元串按照特定分隔符拆分為多個子字元串等;
- 數據清洗和預處理,例如去除空格、標點符號、數字等非文本內容,將文本轉換為小寫或大寫,統一格式等;
- 文本匹配和模式識別,例如使用正則表達式從文本中提取特定模式的內容等;
- 篩選和排序,例如篩選包含特定字元或模式的數據行,對數據行按照字元串排序等;
字元串在python
中是str
類型。
In [1]: s = "hello"
In [2]: type(s)
Out[2]: str
但是在pandas
的DataFrame
中則是object
類型。
import pandas as pd
df = pd.DataFrame(
{
"name": ["小華", "小紅", "小明"],
"age": [12, 15, 13],
"score": [80.5, 98.5, 80],
},
)
df.dtypes
為什麼在pandas
中,字元串是object
類型呢?
因為pandas
中的數據類型繼承自numpy
的ndarray
,ndarray
的每個元素都必須明確占用記憶體的大小。
對於int64
和float64
來說,它們都占用8個位元組的記憶體,而字元串由於長度不固定,無法確定占用記憶體的大小,所以都用object
類型,這個object
類型可以看做是一個指向實際存儲字元串位置的的指針。
2. 數值類型
數值類型有兩種,一種是整數,一種是浮點數(也就是平時說的小數)。
一般來說,各類分析演算法以及可視化展示需要的都是數值類型,數值類型是我們分析數據時使用最多的部分。
上面的示例中,age
和score
列分別是整數和浮點數類型。
import pandas as pd
df = pd.DataFrame(
{
"name": ["小華", "小紅", "小明"],
"age": [12, 15, 13],
"score": [80.5, 98.5, 80],
},
)
df.dtypes
DataFrame
中數值類型預設是64
位的,可以存儲更大的數字。
3. catagory 類型
pandas
中的category
類型是一種用於處理分類變數的數據類型。
它可以大大提高數據處理和計算效率,並減少記憶體占用。
在某些情況下,數據中的一些變數只包含有限的可能取值,例如“性別”、“地區”等,這些變數可以歸類為分類變數。
如果將這些變數存儲為字元串或數字形式,則可能會浪費大量的記憶體,因為每個變數都會占據大量的空間。
這就是category類型的用處:使用category類型可以將這些變數存儲為原始數據的唯一值的散列表,從而大大減少了記憶體占用。
除了記憶體優化外,category類型還提供了一些便捷的方法來處理分類變數,例如自動排序和類別之間的比較。
因此,如果數據中包含分類變數,則應該使用category類型來優化數據處理和計算效率。
下麵的示例,使用中國人口統計的相關數據,預設導入之後數據情況如下:
import pandas as pd
fp = "http://databook.top:8888/pandas/cn-people.csv"
df = pd.read_csv(fp)
df
各個列的預設類型如下:
df.dtypes
其中【指標編碼】和【指標中文】列的類型其實是字元串。
各個列實際占用的記憶體大小:
df.memory_usage(deep=True)
Index
表示索引所占用的記憶體大小,可以看出【指標編碼】和【指標中文】占用的記憶體比較多,而且這兩列重覆數據也比較多。
嘗試將【指標編碼】和【指標中文】兩列轉換為catagory類型之後,看看記憶體占用是否減少。
df["指標中文"] = df["指標中文"].astype("category")
df["指標編碼"] = df["指標編碼"].astype("category")
df.dtypes
類型已經轉換成功,看看pandas
是如何給catagory
類型編碼的。
df["指標中文"].values.codes
可以看出,是用int8
類型來編碼,int8
類型只占用1個位元組的記憶體,總體應該能夠節省不少記憶體空間。
df.memory_usage(deep=True)
【指標編碼】和【指標中文】兩列的記憶體占用只有原來的約1/200
。
4. 類型間的轉換
pandas中的類型轉換操作可以將一種數據類型轉換為另一種數據類型,以便更好地處理和分析數據。
數據類型的選擇會影響數據的存儲方式和計算速度,因此,在不同的情況下,數據類型的選擇是非常重要的,正確的選擇可以有效地提高代碼的性能和準確性。
例如,將文本數據轉換為數字數據,可以使得數據更容易進行數值運算和可視化,從而方便地做出相關的決策和分析。
類型轉換常用的兩種方式是astype
函數和自定義函數。
4.1 astype
類型轉換最常用的方法是astype
,前面介紹catagory
類型時,示例中已經演示了字元串類型到catagory類型的轉換。
數值類型之間,或者數值類型和字元串類型之間也是可以互相轉換的。
df = pd.DataFrame(
{
"name": ["小華", "小紅", "小明"],
"age": [12, 15, 13],
"score": [80.5, 98.5, 80],
},
)
print(df.dtypes)
# int64 ==> float64
df.age = df.age.astype("float64")
# float64 ==> string
df.score = df.score.astype("str")
print(df.dtypes)
4.2 自定義函數
字元串類型也是可以轉換成數值類型的,前提是字元串的內容得是數值。
df = pd.DataFrame(
{
"name": ["小華", "小紅", "小明"],
"money": ["¥55", "¥12", "¥58"],
"score": ["80.5", "98.5", "80"],
},
)
print(df.dtypes)
# df.name.astype("int64")
# df.money.astype("int64")
df.score = df.score.astype("float64")
print(df.dtypes)
score
列有字元串類型轉換為了float64
類型,另外代碼中註釋的兩行是不能成功轉換的,去掉註釋後,代碼執行時會拋出異常錯誤。
看上面的示例數據,name
列是不太可能轉成數值類型的,但是money
列只是多了一個人民幣符號¥
,其實這列本質上應該是數值類型,也許後續需要根據這列的數值來分析花費的費用等情況。
這時,直接用astype
是無法完成類型轉換的,要用自定義函數來去掉人民幣符號¥
,再轉換成數值類型。
df = pd.DataFrame(
{
"name": ["小華", "小紅", "小明"],
"money": ["¥55", "¥12", "¥58"],
"score": ["80.5", "98.5", "80"],
},
)
convert = lambda s: float(s.replace("¥", ""))
print(df.dtypes)
df.money = df.money.apply(convert)
print(df.dtypes)
通過自定義的convert
函數,money
列成功轉換成了float64
類型。
5. 總結回顧
這裡只是介紹了最常見的數據類型,還有日期類型也很重要,下一篇單獨介紹。
除此之外,細分的話,還有以下各類數據類型:
- int:整數類型
- float:浮點數類型
- bool:布爾類型,True/False
- object:對象類型,可以是字元串、Python對象等
- datetime:日期時間類型
- timedelta:兩個日期時間之間的差
- category:分類類型,如性別、國家等
- int8/16/32/64:指定大小的整數類型
- uint8/16/32/64:無符號整數類型,只能是正整數