Pandas 清洗空值
空值
分析数据时,空值可能会导致一个错误的结果。
删除行
处理空值的一种方法是删除包含空值的行。
这通常是可以的,因为数据集可能非常大,删除几行不会对结果产生太大影响。
实例
返回一个没有空值的 DataFrame:
import pandas as pd
df = pd.read_csv('data.csv')
new_df = df.dropna()
print(new_df.to_string())
#请注意,结果中有些行已被删除(第18、22和28行)。
#这些行有空值。
在我们的清理示例中,我们将使用名为 "dirtydata.csv" 的 CSV 文件。
下载 dirtydata.csv 或者用浏览器打开 dirtydata.csv
注意:默认情况下,dropna()
方法返回一个新的 DataFrame,并且不会更改原始 DataFrame。
如果要更改原始的 DataFrame,请使用 inplace = True
参数:
实例
移除所有具有空值的行:
import pandas as pd
df = pd.read_csv('data.csv')
df.dropna(inplace = True)
print(df.to_string())
#请注意,结果中有些行已被删除(第18、22和28行)。
#这些行有空值。
注意:现在,dropna(inplace=True)将不会返回新的 DataFrame,但它将从原始 DataFrame 中删除包含 NULL 值的所有行。
替换空数据
另一种处理空值的方法是插入 新 值。
这样,您就不必因为某些空值而删除整行。
fillna()
方法允许我们用以下值替换空值:
实例
用数字 130 来替换空值:
import pandas as pd
df = pd.read_csv('data.csv')
df.fillna(130, inplace = True)
print(df.to_string())
#请注意结果:空值变为 130(在第18、22和28行)。
仅替换指定的列
上面的示例替换整个 DataFrame 中的所有空值。
要仅替换一列的空值,请为 DataFrame 指定 列名 :
实例
用数字 130 来替换 Calories 列的空值:
import pandas as pd
df = pd.read_csv('data.csv')
df["Calories"].fillna(130, inplace = True)
print(df.to_string())
#此操作在 "Calories" 列(第 18 行和第 28 行)的空值处插入 130。
使用 Mean, Median, 或者 Mode 来替换
替换空值的常用方法是计算列的平均值、中间值或众数。
Pandas 使用 mean()
median()
和 mode()
方法计算指定列的相应值:
实例
计算平均值并用其替换空值:
import pandas as pd
df = pd.read_csv('data.csv')
x = df["Calories"].mean()
df["Calories"].fillna(x, inplace = True)
print(df.to_string())
#如第 18 行和第 28 行所示,"Calories" 的空值被替换为平均值:304.68
Mean = 平均值(所有值之和除以值的个数)。
实例
计算中间值并用其替换空值:
import pandas as pd
df = pd.read_csv('data.csv')
x = df["Calories"].median()
df["Calories"].fillna(x, inplace = True)
print(df.to_string())
#如第 18 行和第 28 行所示,"Calories" 的空值被替换为中值: 291.2
Median = 在升序排序所有值之后的中间值。
实例
计算众值并用其替换空值:
import pandas as pd
df = pd.read_csv('data.csv')
x = df["Calories"].mode()[0]
df["Calories"].fillna(x, inplace = True)
print(df.to_string())
#如第 18 行和第 28 行所示,"Calories" 的空值被替换为众值:304.68
Mode = 出现频率最多的值