介绍
在本教程中,您将学习如何获取 DataFrame 或 Series 中的数据类型,以及如何查找和替换数据项。

Dtypes

DataFrame 或 Series 中列的数据类型被称为dtype,所以可以使用dtype属性获取特定列的类型。

  1. pandas.DataFrame.dtypes

返回DataFrame 中的数据类型。

这将返回一个包含每个列的数据类型的序列。结果的索引是原始DataFrame 的列。多种类型混合存储的列称为 object ,如字符串等类型。
例如,我们可以在reviews 结果的DataFrame 中获取price列的数据类型:

  1. import pandas as pd
  2. reviews = pd.read_csv("../data/winemag-data-130k-v2.csv", index_col=0)
  3. print(reviews.price.dtype) # 数据类型为 float64

也可以利用 dtypes 属性返回 DataFrame 中每个列的数据类型:

  1. import pandas as pd
  2. reviews = pd.read_csv("../data/winemag-data-130k-v2.csv", index_col=0)
  3. print(reviews.dtypes) # 返回 reviews 中所有列的数据类型
  1. country object
  2. description object
  3. designation object
  4. points int64
  5. price float64
  6. province object
  7. region_1 object
  8. region_2 object
  9. taster_name object
  10. taster_twitter_handle object
  11. title object
  12. variety object
  13. winery object
  14. dtype: object

我们通过数据类型知道 pandas 数据在内部是如何存储的。float64表示它使用64位浮点数存储、int64表示用相似存储空间的整数,以此类推。
从上面的处理结果中可以明显的发现,数据类型为字符串的列的类型并没有正确的返回,而是被替换为一种对象 (object)类型。这是因为字符串长度是不固定的,pandas没有用字节字符串的形式而是用了object ndarray
可以通过使用 astype() 函数将一种类型的列转换为另一种类型,前提是这种转换要可以实现。例如,我们可以将points 列从其现有的 int64 数据类型转换为 float64 数据类型:

  1. import pandas as pd
  2. reviews = pd.read_csv("../data/winemag-data-130k-v2.csv", index_col=0)
  3. print(reviews.points.dtype) # 存储的数据类型为 int64
  4. print(reviews.points.astype('float64')) # 输出时转换数据类型为 int64
  5. print(reviews.points.dtype) # 存储的数据类型仍为 int64
  1. int64
  2. # 仅在输出时转换为 float64 类型显示,不影响存储的数据类型
  3. 0 87.0
  4. 1 87.0
  5. 2 87.0
  6. 3 87.0
  7. 4 87.0
  8. ...
  9. 129966 90.0
  10. 129967 90.0
  11. 129968 90.0
  12. 129969 90.0
  13. 129970 90.0
  14. Name: points, Length: 129971, dtype: float64
  15. int64

DataFrame 或 Series索引也有自己的数据类型:

  1. import pandas as pd
  2. reviews = pd.read_csv("../data/winemag-data-130k-v2.csv", index_col=0)
  3. print(reviews.index.dtype) # reviews的索引的数据类型为 int64

Pandas还支持一些外部的数据类型,如分类数据和时间序列数据。由于这些数据类型很少使用,因此本教程先略过不介绍它们。

缺失数据

缺少值的数据项被赋值为 NaN,是“Not a Number”的缩写。出于技术原因,这些 NaN 值始终是 float64 数据类型。
Pandas提供了一些特定方法用于处理缺失数据。为选择NaN条目,可以使用pd.isnull()(或其相对应的pd.notnull()方法)。这两个方法可以这样使用:

  1. import pandas as pd
  2. reviews = pd.read_csv("../data/winemag-data-130k-v2.csv", index_col=0)
  3. print(reviews[pd.isnull(reviews.country)]) # 返回国家值缺失的数据
  1. country ... winery
  2. 913 NaN ... Gotsa Family Wines
  3. 3131 NaN ... Barton & Guestier
  4. 4243 NaN ... Kakhetia Traditional Winemaking
  5. 9509 NaN ... Tsililis
  6. 9750 NaN ... Ross-idi
  7. ... ... ... ...
  8. 124176 NaN ... Les Frères Dutruy
  9. 129407 NaN ... El Capricho
  10. 129408 NaN ... El Capricho
  11. 129590 NaN ... Büyülübağ
  12. 129900 NaN ... Psagot
  13. [63 rows x 13 columns]

对缺失的值进行替换是经常会被用到的操作。Pandas为解决这个问题提供了一个非常方便的方法:fillna()。
fillna() 提供了一些不同的策略来减少此类数据的影响。例如,我们可以简单地用“Unknown”替换每个NaN:

  1. import pandas as pd
  2. reviews = pd.read_csv("../data/winemag-data-130k-v2.csv", index_col=0)
  3. print(reviews.region_2.fillna("Unknown")) # 用“Unknown”替换每个NaN
  1. 0 Unknown
  2. 1 Unknown
  3. 2 Willamette Valley
  4. 3 Unknown
  5. 4 Willamette Valley
  6. ...
  7. 129966 Unknown
  8. 129967 Oregon Other
  9. 129968 Unknown
  10. 129969 Unknown
  11. 129970 Unknown
  12. Name: region_2, Length: 129971, dtype: object

或者,我们可以用数据库中给定记录里,缺失值后面出现的第一个非空值替换填充每个缺失的值,这种策略称为回填。
有时,我们可能有一个想要用于替换的非空值。例如,假设自从这个数据集发布以来,评论者 Kerin O’Keefe 已经将她的 Twitter 操作者从 @kerinokeefe 更改为 @kerino。在数据集中实现这种替换的方法是使用replace()方法:

  1. import pandas as pd
  2. reviews = pd.read_csv("../data/winemag-data-130k-v2.csv", index_col=0)
  3. print(reviews.taster_twitter_handle.replace("@kerinokeefe", "@kerino"))
  1. 0 @kerino
  2. 1 @vossroger
  3. 2 @paulgwine
  4. 3 NaN
  5. 4 @paulgwine
  6. ...
  7. 129966 NaN
  8. 129967 @paulgwine
  9. 129968 @vossroger
  10. 129969 @vossroger
  11. 129970 @vossroger
  12. Name: taster_twitter_handle, Length: 129971, dtype: object

数据集中的缺失数据经常会被加上”Unknown”, “Undisclosed”, “Invalid”等标记,replace() 方法非常广泛的被应用于替换在数据集中这些给定某种标记的缺失数据。