pandas数据清理大全
缺失数据
为了做演示,我们首先新建一个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]
版权声明:
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自
soap的会员制餐厅!
喜欢就支持一下吧