处理 Pandas 中的缺失数据
在 Pandas 中,缺失值用None 或 NaN表示,这可能是由于未收集数据或条目不完整而发生的。让我们探索如何检测、处理和填充 DataFrame 中的缺失值,以确保准确的分析。
目录
- 检查 Pandas DataFrame 中的缺失值
- 填充 Pandas 中的缺失值
- 删除 Pandas 中的缺失值
检查 Pandas DataFrame 中的缺失值
为了识别和处理缺失值,Pandas 提供了两个有用的函数:isnull()和notnull()。这些函数有助于检测某个值是否为NaN,从而更容易清理和预处理 DataFrame 或 Series 中的数据。
1. 使用 isnull() 检查缺失值
isnull()返回布尔值的 DataFrame,其中True表示缺失数据 ( NaN )。当您想要定位和处理数据集中的缺失数据时,这很有用。
示例 1:检测 DataFrame 中的缺失值
Python
# Importing pandas and numpy
import pandas as pd
import numpy as np
# Sample DataFrame with missing values
data = {'First Score': [100, 90, np.nan, 95],
'Second Score': [30, 45, 56, np.nan],
'Third Score': [np.nan, 40, 80, 98]}
df = pd.DataFrame(data)
# Checking for missing values using isnull()
missing_values = df.isnull()
print(missing_values)
输出:
示例 2:根据缺失值过滤数据
在本例中,isnull()函数应用于“性别”列,以筛选和显示缺少性别信息的行。
Python
import pandas as pd
data = pd.read_csv("employees.csv")
bool_series = pd.isnull(data["Gender"])
missing_gender_data = data[bool_series]
print(missing_gender_data)
输出:
使用 notnull() 检查缺失值
notnull()返回布尔值的 DataFrame,其中 True 表示非缺失数据。当您想关注包含有效、非缺失数据的行时,此函数非常有用。
示例 3:检测 DataFrame 中的非缺失值
Python
# Importing pandas and numpy
import pandas as pd
import numpy as np
# Sample DataFrame with missing values
data = {'First Score': [100, 90, np.nan, 95],
'Second Score': [30, 45, 56, np.nan],
'Third Score': [np.nan, 40, 80, 98]}
df = pd.DataFrame(data)
# Checking for non-missing values using notnull()
non_missing_values = df.notnull()
print(non_missing_values)
输出:
示例 4:使用非缺失值筛选数据
此代码片段使用notnull()函数筛选出“性别”列没有缺失值的行。
Python
# Importing pandas
import pandas as pd
# Reading data from a CSV file
data = pd.read_csv("employees.csv")
# Identifying non-missing values in the 'Gender' column
non_missing_gender = pd.notnull(data["Gender"])
# Filtering rows where 'Gender' is not missing
non_missing_gender_data = data[non_missing_gender]
display(non_missing_gender_data)
输出:
使用 fillna()、replace() 和 interpolate() 填充 Pandas 中的缺失值
在处理 Pandas 中的缺失数据时,通常使用fillna()、replace()和interpolate()函数来填充 NaN 值。这些函数允许您用特定值替换缺失值或使用插值技术。
1. 使用 fillna() 用特定值填充缺失值
fillna()函数用于用指定值替换缺失值 ( NaN )。例如,您可以用 0 填充缺失值。
示例:用零填充缺失值
Python
import pandas as pd
import numpy as np
dict = {'First Score': [100, 90, np.nan, 95],
'Second Score': [30, 45, 56, np.nan],
'Third Score': [np.nan, 40, 80, 98]}
df = pd.DataFrame(dict)
# Filling missing values with 0
df.fillna(0)
输出:
2. 使用 fillna 用上一个/下一个值填充缺失值
您可以使用pad方法用前一个值填充缺失值,或使用 bfill用下一个值填充。我们将使用上述数据集进行演示。
示例:使用前一个值填充(正向填充)
Python
df.fillna(method='pad') # Forward fill
输出:
示例:用下一个值填充(向后填充)
Python
df.fillna(method='bfill') # Backward fill
输出:
示例:使用 fillna() 将 NaN 值填充为“无性别”
Python
import pandas as pd
import numpy as np
data = pd.read_csv("employees.csv")
# Print records from 10th row to 24th row
data[10:25]
输出
现在我们将用“无性别”填充“性别”列中的所有空值
Python
# filling a null values using fillna()
data["Gender"].fillna('No Gender', inplace = True)
data[10:25]
输出:
3. 使用 replace() 替换缺失值
使用replace()将NaN值替换为特定值,例如-99。
例如:用 -99 替换 NaN
Python
import pandas as pd
import numpy as np
data = pd.read_csv("employees.csv")
data[10:25]
输出:
现在,我们将用 -99 值替换数据框中的所有 Nan 值。
Python
data.replace(to_replace=np.nan, value=-99)
输出:
4. 使用 interpolate() 填充缺失值
interpolate()函数使用插值技术(例如线性方法)填充缺失值。
示例:线性插值
Python
# importing pandas as pd
import pandas as pd
# Creating the dataframe
df = pd.DataFrame({"A": [12, 4, 5, None, 1],
"B": [None, 2, 54, 3, None],
"C": [20, 16, None, 3, 8],
"D": [14, 3, None, None, 6]})
# Print the dataframe
print(df)
输出:
让我们使用线性方法插入缺失值。请注意,线性方法忽略索引并将值视为等距。
Python
# to interpolate the missing values
df.interpolate(method ='linear', limit_direction ='forward')
输出:
此方法通过将数据视为等间距来填充缺失值。
使用 dropna() 删除 Pandas 中的缺失值
Pandas 中的dropna ()函数删除具有NaN值的行或列。它可用于根据不同的条件删除数据。
1.删除至少有一个空值的行
使用dropna()删除至少包含一个缺失值的行。
示例:删除至少有一个 NaN 的行
Python
import pandas as pd
import numpy as np
dict = {'First Score': [100, 90, np.nan, 95],
'Second Score': [30, np.nan, 45, 56],
'Third Score': [52, 40, 80, 98],
'Fourth Score': [np.nan, np.nan, np.nan, 65]}
df = pd.DataFrame(dict)
# Drop rows with at least one missing value
df.dropna()
输出:
2.删除所有值为空的行
您可以使用dropna(how='all')删除所有值均缺失的行。
示例:删除所有具有 NaN 值的行
Python
dict = {'First Score': [100, np.nan, np.nan, 95],
'Second Score': [30, np.nan, 45, 56],
'Third Score': [52, np.nan, 80, 98],
'Fourth Score': [np.nan, np.nan, np.nan, 65]}
df = pd.DataFrame(dict)
# Drop rows where all values are missing
df.dropna(how='all')
输出:
3.删除至少有一个空值的列
要删除至少包含一个缺失值的列,请使用dropna(axis=1)。
示例:删除至少有一个 NaN 的列
Python
dict = {'First Score': [100, np.nan, np.nan, 95],
'Second Score': [30, np.nan, 45, 56],
'Third Score': [52, np.nan, 80, 98],
'Fourth Score': [60, 67, 68, 65]}
df = pd.DataFrame(dict)
# Drop columns with at least one missing value
df.dropna(axis=1)
输出 :
4.删除 CSV 文件中含有缺失值的行
处理 CSV 文件中的数据时,可以使用dropna()删除缺少值的行。
示例:删除 CSV 文件中含有 NaN 的行
Python
import pandas as pd
data = pd.read_csv("employees.csv")
# Drop rows with any missing value
new_data = data.dropna(axis=0, how='any')
# Compare lengths of original and new dataframes
print("Old data frame length:", len(data))
print("New data frame length:", len(new_data))
print("Rows with at least one missing value:", (len(data) - len(new_data)))
输出 :
Old data frame length: 1000 New data frame length: 764 Rows with at least one missing value: 236
由于差值为 236,因此有 236 行在任何一列中至少有 1 个 Null 值。
处理 Pandas 中的缺失数据 - 常见问题解答
如何获取 Pandas 中缺少数据的行?
Use isna() combined with any() to find rows with missing values:
import pandas as pd
df = pd.DataFrame({
‘A’: [1, 2, None, 4],
‘B’: [‘a’, ‘b’, ‘c’, None]
})
rows_with_missing = df[df.isna().any(axis=1)]
print(rows_with_missing)
如何处理数据集中缺失的数据?
- 删除缺失数据:用于dropna()删除具有缺失值的行或列。
- 填充缺失数据:使用fillna()特定值或计算统计数据(如平均值或中位数)填充缺失值。
- 插值:对于数值数据,用来interpolate()估计缺失值。
如何使用平均值填充Pandas中的缺失值?
Fill missing numerical values with the column mean using fillna():
df[‘A’] = df[‘A’].fillna(df[‘A’].mean())
有哪些方法可以处理丢失或损坏的数据?
- 归因:用平均值、中位数或众数替换缺失值。
- 支持缺失数据的算法:一些 ML 算法直接处理缺失值。
- 预测:使用模型根据其他数据预测缺失值。
如何计算Pandas中的缺失值?
Count missing values per column with isna() and sum():
missing_value_count = df.isna().sum()