Pandas 清洗空值

空值

分析数据时,空值可能会导致一个错误的结果。


删除行

处理空值的一种方法是删除包含空值的行。

这通常是可以的,因为数据集可能非常大,删除几行不会对结果产生太大影响。

实例

返回一个没有空值的 DataFrame:

  1. import pandas as pd
  2. df = pd.read_csv('data.csv')
  3. new_df = df.dropna()
  4. print(new_df.to_string())
  5. #请注意,结果中有些行已被删除(第18、22和28行)。
  6. #这些行有空值。

在我们的清理示例中,我们将使用名为 "dirtydata.csv" 的 CSV 文件。

下载 dirtydata.csv 或者用浏览器打开 dirtydata.csv

注意:默认情况下,dropna() 方法返回一个新的 DataFrame,并且不会更改原始 DataFrame。

如果要更改原始的 DataFrame,请使用 inplace = True 参数:

实例

移除所有具有空值的行:

  1. import pandas as pd
  2. df = pd.read_csv('data.csv')
  3. df.dropna(inplace = True)
  4. print(df.to_string())
  5. #请注意,结果中有些行已被删除(第18、22和28行)。
  6. #这些行有空值。

注意:现在,dropna(inplace=True)将不会返回新的 DataFrame,但它将从原始 DataFrame 中删除包含 NULL 值的所有行。


替换空数据

另一种处理空值的方法是插入 值。

这样,您就不必因为某些空值而删除整行。

fillna() 方法允许我们用以下值替换空值:

实例

用数字 130 来替换空值:

  1. import pandas as pd
  2. df = pd.read_csv('data.csv')
  3. df.fillna(130, inplace = True)
  4. print(df.to_string())
  5. #请注意结果:空值变为 130(在第18、22和28行)。
仅替换指定的列

上面的示例替换整个 DataFrame 中的所有空值。

要仅替换一列的空值,请为 DataFrame 指定 列名

实例

用数字 130 来替换 Calories 列的空值:

  1. import pandas as pd
  2. df = pd.read_csv('data.csv')
  3. df["Calories"].fillna(130, inplace = True)
  4. print(df.to_string())
  5. #此操作在 "Calories" 列(第 18 行和第 28 行)的空值处插入 130。

使用 Mean, Median, 或者 Mode 来替换

替换空值的常用方法是计算列的平均值、中间值或众数。

Pandas 使用 mean() median()mode() 方法计算指定列的相应值:

实例

计算平均值并用其替换空值:

  1. import pandas as pd
  2. df = pd.read_csv('data.csv')
  3. x = df["Calories"].mean()
  4. df["Calories"].fillna(x, inplace = True)
  5. print(df.to_string())
  6. #如第 18 行和第 28 行所示,"Calories" 的空值被替换为平均值:304.68

Mean = 平均值(所有值之和除以值的个数)。

实例

计算中间值并用其替换空值:

  1. import pandas as pd
  2. df = pd.read_csv('data.csv')
  3. x = df["Calories"].median()
  4. df["Calories"].fillna(x, inplace = True)
  5. print(df.to_string())
  6. #如第 18 行和第 28 行所示,"Calories" 的空值被替换为中值: 291.2

Median = 在升序排序所有值之后的中间值。

实例

计算众值并用其替换空值:

  1. import pandas as pd
  2. df = pd.read_csv('data.csv')
  3. x = df["Calories"].mode()[0]
  4. df["Calories"].fillna(x, inplace = True)
  5. print(df.to_string())
  6. #如第 18 行和第 28 行所示,"Calories" 的空值被替换为众值:304.68

Mode = 出现频率最多的值

分类导航