本文共 2740 字,大约阅读时间需要 9 分钟。
-在能够使用大型数据集训练学习算法之前,我们通常需要先清理数据, 也就是说,我们需要通过某个方法检测并更正数据中的错误。
import pandas as pd# We create a list of Python dictionaries# 创建一个字典列表items2 = [{ 'bikes': 20, 'pants': 30, 'watches': 35, 'shirts': 15, 'shoes':8, 'suits':45},{ 'watches': 10, 'glasses': 50, 'bikes': 15, 'pants':5, 'shirts': 2, 'shoes':5, 'suits':7},{ 'bikes': 20, 'pants': 30, 'watches': 35, 'glasses': 4, 'shoes':10}]# 创建一个DataFrame并设置行索引store_items = pd.DataFrame(items2, index = ['store 1', 'store 2', 'store 3'])# 显示store_items
显示:
# 计算在store_items中NaN值的个数x = store_items.isnull().sum().sum()# 输出print('在我们DataFrame中NaN的数量:', x)
输出:
在我们DataFrame中NaN的数量: 3
.isnull()
方法返回一个大小和 store_items 一样的布尔型 DataFrame,并用 True
表示具有 NaN 值的元素,用 False
表示非 NaN 值的元素。store_items.isnull()
显示:
sum()
返回一个 Pandas Series,其中存储了列上的逻辑值 True
的总数sum()
将上述 Pandas Series 中的 1 相加除了数 NaN 值的数量之外,我们还可以采用相反的方式,我们可以数非 NaN 值的数量。为此,我们可以使用 .count()
方法
print('在我们DataFrame的列中具有非NaN值得数量分别为:\n', store_items.count())
输出:
在我们DataFrame的列中具有非NaN值得数量: bikes 3glasses 2pants 3shirts 2shoes 3suits 2watches 3dtype: int64
# 删除包含NaN值得任何行store_items.dropna(axis = 0)
显示为:
store_items.dropna(axis = 1)
显示为:
注意:
.dropna()
方法不在原地地删除具有 NaN 值的行或列。dropna()
方法中将关键字 inplace
设为 True
,在原地删除目标行或列。我们不再删除 NaN 值,而是将它们替换为合适的值。例如,我们可以选择将所有 NaN 值替换为 0。为此,我们可以使用 .fillna()
方法
store_items.fillna(0)
显示:
我们还可以使用 .fillna()
方法将 NaN 值替换为 DataFrame 中的上个值,称之为前向填充
.fillna(method = 'ffill', axis)
将通过前向填充 (ffill) 方法沿着给定 axis 使用上个已知值替换 NaN 值
store_items.fillna(method = 'ffill', axis = 0)
显示:
现在,使用上个行值进行前向填充
store_items.fillna(method = 'ffill', axis = 1)
显示:
同时,也可以选择用 DataFrame 中之后的值替换 NaN 值,称之为后向填充
# 向后填充列,即为NaN的列值,用其列中的后一个来填充store_items.fillna(method = 'backfill', axis = 0)
同理:也可以向后填充行,即为NaN的行值,用其行中的后一个来填充
# 向后填充行,即为NaN的行值,用其行中的后一个来填充store_items.fillna(method = 'backfill', axis = 1)
注意:.fillna()
方法不在原地地替换(填充)NaN 值。也就是说,原始 DataFrame 不会改变。你始终可以在 fillna()
函数中将关键字 inplace
设为 True
,在原地替换 NaN
值。
.interpolate(method = 'linear', axis)
方法将通过 linear 插值使用沿着给定 axis 的值替换 NaN 值, 这个差值也就是前后或者上下的中间值store_items.interpolate(method = 'linear', axis = 0)
同时,也可用行值插入
store_items.interpolate(method = 'linear', axis = 1)
和我们看到的其他方法一样,.interpolate()
方法不在原地地替换 NaN 值,图片就省略了。