缺失数据

为了做演示,我们首先新建一个DataFrame

import numpy as np
import pandas as pd

# 假设df是你的DataFrame
df = pd.DataFrame({
    'A': [1, 2, np.nan, 4],
    'B': [5, np.nan, np.nan, 8],
    'C': [9, 10, 11, 12]
})

查找缺失数据

检查整个DataFrame的缺失数据

missing_values = df.isnull() # 返回一个布尔值的DataFrame

统计每列/行的缺失值数量

missing_counts = df.isnull().sum() # 统计每列中有多少个空数据,返回一个序列,得到每列的缺失值数量
missing_counts = df.isnull().sum(axis=True) # 统计每行中有多少个空数据,返回一个序列,得到每列的缺失值数量

查找包含任何缺失值的列/行

rows_with_missing = df.isnull().any() # 检查每列中有多少个空数据,返回一个布尔序列
rows_with_missing = df.isnull().any(axis=True) # 检查每行中有多少个空数据,返回一个布尔序列
rows_with_missing_df = df[df.isnull().any(axis=True)] # 可以获取这些带有空数据的行

查找特定的列/行的缺失数据

# 对于特定列
df["A"].isnull() # 查找整一列的缺失数据,返回一个布尔序列
df["A"].isnull().sum() # 统计整一列的缺失数据,返回一个int类型的数字
df["A"].isnull().any() # 查找该列是否包含任意缺失值,返回一个bool

# 对于特定行
df.iloc[0].isnull() # 查找某一行的缺失数据,返回一个布尔序列
df.iloc[0].isnull().sum() # 统计整一行的缺失数据,返回一个int类型的数字
df.iloc[0].isnull().any() # 查找该行是否包含任意缺失值,返回一个bool

删除缺失数据

删除任何含有缺失值的行/列

dropna()函数默认不会改变原DataFrame,而是返回一个新的DataFrame。如果你想直接在原DataFrame上进行修改,可以添加参数inplace=True

df.dropna(inplace=True) # 删除任何含有缺失值的行
df.dropna(axis=1, inplace=True) # 删除任何含有缺失值的列

删除所有值都是缺失值的行/列

# how 参数可以是 'any'(只要有缺失值就删除,默认行为)、'all'(所有值都是缺失值才删除)
df.dropna(how='all', inplace=True) # 删除所有值都是缺失值的行
df.dropna(axis=1, how='all', inplace=True) # 删除所有值都是缺失值的列

针对特定列删除含有缺失值的行

df.dropna(subset=['A', 'B'], inplace=True)

删除至少有n个缺失值的行

df.dropna(thresh=len(df.columns)-n, inplace=True)

填充缺失数据

使用常数值填充

fillna()函数默认不会改变原DataFrame,而是返回一个新的DataFrame。如果你想直接在原DataFrame上进行修改,可以添加参数inplace=True

# 填充缺失值为0
df.fillna(0, inplace=True)

# 或者填充为其他常数值,例如特定字符串
df.fillna("missing", inplace=True)

使用列的统计值填充,可以为如下:

  • 均值

df['A'].fillna(df['A'].mean(), inplace=True)
  • 中位数

df['A'].fillna(df['A'].median(), inplace=True)
  • 众数

mode = df['A'].mode()
if not mode.empty:
    df['A'].fillna(mode[0], inplace=True)

使用前一个或后一个有效值填充(前向填充/后向填充),这两种方法可以结合使用,例如先前向填充再后向填充,以减少缺失值

df.fillna(method='ffill', inplace=True) # 前向填充
df.fillna(method='bfill', inplace=True) # 后向填充

使用指定列的值填充

df['A'].fillna(df['B'], inplace=True)

对于连续数据,可以使用线性插值或其他插值方法:

df['A'].interpolate(inplace=True)
df['A'].interpolate(method='linear', inplace=True) # 或者指定插值方法,如线性插值

重复数据

检测重复数据的行

df.duplicated() # 返回一个序列

统计重复数据的数量

df.duplicated().sum() # 返回一个int类型的数

删除重复数据的行

# 删除重复行,保留第一次出现的记录,返回一个dataframe
df_unique = df.drop_duplicates()

# 删除重复行,保留最后一次出现的记录,返回一个dataframe
df_unique_last = df.drop_duplicates(keep='last')

# 删除所有重复行,即使这意味着整行都会被移除,返回一个dataframe
df_unique_all = df.drop_duplicates(keep=False)

基于特定列检测和删除重复数据

# 基于'A'和'B'列检测重复,返回一个dataframe
duplicates_subset = df.duplicated(subset=['A', 'B'])

# 基于同样的列删除重复行,返回一个dataframe
df_unique_subset = df.drop_duplicates(subset=['A', 'B'])

重建索引

重建行索引

按照特定顺序重排索引顺序

new_index_order = [2, 0, 1]  # 新的索引顺序
df = df.reindex(new_index_order) # 会将索引为0的这一行放到第二行,其他同理

重置索引为默认整数序列

df = df.reset_index() # 重建索引,但保留原有的index,将原来的index放在dataframe,变为新的一列
df = df.reset_index(drop=True) # 重建索引
df.index = range(df.shape[0]) # 也可以这样重建索引

重建列索引

重命名列索引

df.columns = [0, 1, 2]

文章作者: Vsoapmac
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 soap的会员制餐厅
数据分析 第三方库 个人分享
喜欢就支持一下吧