介绍
在本教程中,您将学习如何获取 DataFrame 或 Series 中的数据类型,以及如何查找和替换数据项。
Dtypes
DataFrame 或 Series 中列的数据类型被称为dtype,所以可以使用dtype属性获取特定列的类型。
pandas.DataFrame.dtypes
返回DataFrame 中的数据类型。
这将返回一个包含每个列的数据类型的序列。结果的索引是原始DataFrame 的列。多种类型混合存储的列称为 object
,如字符串等类型。
例如,我们可以在reviews 结果的DataFrame 中获取price列的数据类型:
import pandas as pd
reviews = pd.read_csv("../data/winemag-data-130k-v2.csv", index_col=0)
print(reviews.price.dtype) # 数据类型为 float64
也可以利用 dtypes 属性返回 DataFrame 中每个列的数据类型:
import pandas as pd
reviews = pd.read_csv("../data/winemag-data-130k-v2.csv", index_col=0)
print(reviews.dtypes) # 返回 reviews 中所有列的数据类型
country object
description object
designation object
points int64
price float64
province object
region_1 object
region_2 object
taster_name object
taster_twitter_handle object
title object
variety object
winery object
dtype: object
我们通过数据类型知道 pandas 数据在内部是如何存储的。float64表示它使用64位浮点数存储、int64表示用相似存储空间的整数,以此类推。
从上面的处理结果中可以明显的发现,数据类型为字符串的列的类型并没有正确的返回,而是被替换为一种对象 (object)类型。这是因为字符串长度是不固定的,pandas没有用字节字符串的形式而是用了object ndarray
可以通过使用 astype() 函数将一种类型的列转换为另一种类型,前提是这种转换要可以实现。例如,我们可以将points 列从其现有的 int64 数据类型转换为 float64 数据类型:
import pandas as pd
reviews = pd.read_csv("../data/winemag-data-130k-v2.csv", index_col=0)
print(reviews.points.dtype) # 存储的数据类型为 int64
print(reviews.points.astype('float64')) # 输出时转换数据类型为 int64
print(reviews.points.dtype) # 存储的数据类型仍为 int64
int64
# 仅在输出时转换为 float64 类型显示,不影响存储的数据类型
0 87.0
1 87.0
2 87.0
3 87.0
4 87.0
...
129966 90.0
129967 90.0
129968 90.0
129969 90.0
129970 90.0
Name: points, Length: 129971, dtype: float64
int64
DataFrame 或 Series索引也有自己的数据类型:
import pandas as pd
reviews = pd.read_csv("../data/winemag-data-130k-v2.csv", index_col=0)
print(reviews.index.dtype) # reviews的索引的数据类型为 int64
Pandas还支持一些外部的数据类型,如分类数据和时间序列数据。由于这些数据类型很少使用,因此本教程先略过不介绍它们。
缺失数据
缺少值的数据项被赋值为 NaN,是“Not a Number”的缩写。出于技术原因,这些 NaN 值始终是 float64 数据类型。
Pandas提供了一些特定方法用于处理缺失数据。为选择NaN条目,可以使用pd.isnull()(或其相对应的pd.notnull()方法)。这两个方法可以这样使用:
import pandas as pd
reviews = pd.read_csv("../data/winemag-data-130k-v2.csv", index_col=0)
print(reviews[pd.isnull(reviews.country)]) # 返回国家值缺失的数据
country ... winery
913 NaN ... Gotsa Family Wines
3131 NaN ... Barton & Guestier
4243 NaN ... Kakhetia Traditional Winemaking
9509 NaN ... Tsililis
9750 NaN ... Ross-idi
... ... ... ...
124176 NaN ... Les Frères Dutruy
129407 NaN ... El Capricho
129408 NaN ... El Capricho
129590 NaN ... Büyülübağ
129900 NaN ... Psagot
[63 rows x 13 columns]
对缺失的值进行替换是经常会被用到的操作。Pandas为解决这个问题提供了一个非常方便的方法:fillna()。
fillna() 提供了一些不同的策略来减少此类数据的影响。例如,我们可以简单地用“Unknown”替换每个NaN:
import pandas as pd
reviews = pd.read_csv("../data/winemag-data-130k-v2.csv", index_col=0)
print(reviews.region_2.fillna("Unknown")) # 用“Unknown”替换每个NaN
0 Unknown
1 Unknown
2 Willamette Valley
3 Unknown
4 Willamette Valley
...
129966 Unknown
129967 Oregon Other
129968 Unknown
129969 Unknown
129970 Unknown
Name: region_2, Length: 129971, dtype: object
或者,我们可以用数据库中给定记录里,缺失值后面出现的第一个非空值替换填充每个缺失的值,这种策略称为回填。
有时,我们可能有一个想要用于替换的非空值。例如,假设自从这个数据集发布以来,评论者 Kerin O’Keefe 已经将她的 Twitter 操作者从 @kerinokeefe 更改为 @kerino。在数据集中实现这种替换的方法是使用replace()方法:
import pandas as pd
reviews = pd.read_csv("../data/winemag-data-130k-v2.csv", index_col=0)
print(reviews.taster_twitter_handle.replace("@kerinokeefe", "@kerino"))
0 @kerino
1 @vossroger
2 @paulgwine
3 NaN
4 @paulgwine
...
129966 NaN
129967 @paulgwine
129968 @vossroger
129969 @vossroger
129970 @vossroger
Name: taster_twitter_handle, Length: 129971, dtype: object
数据集中的缺失数据经常会被加上”Unknown”, “Undisclosed”, “Invalid”等标记,replace() 方法非常广泛的被应用于替换在数据集中这些给定某种标记的缺失数据。