当前位置:首页>python>【Python计算生态】pyjanitor——数据清洗和预处理库

【Python计算生态】pyjanitor——数据清洗和预处理库

  • 2026-10-21 13:29:07
【Python计算生态】pyjanitor——数据清洗和预处理库

Python受欢迎的原因之一就是其计算生态丰富,据不完全统计,Python 目前为止有约13万+的第三方库。

本系列将会陆续整理分享一些有趣、有用的第三方库。

文章配套代码获取有以下两种途径:
  • 通过百度网盘获取:
链接:https://pan.baidu.com/s/1FSGLd7aI_UQlCQuovVHc_Q?pwd=mnsj 提取码:mnsj
  • 前往GitHub获取:
https://github.com/returu/Python_Ecosystem
01
简介:
pyjanitor 是一个基于 Python的数据清洗和预处理库,灵感来源于 R 语言的 janitor 包。旨在简化 Pandas 数据框的操作。它提供了一系列方便的函数,使得数据清洗过程更加直观和高效。
直接使用pip安装:
pip install pyjanitor
GitHub页面:
https://github.com/pyjanitor-devs/pyjanitor
02
与pandas的使用对比:
本次将以以下数据清洗路径为例,对比pyjanitor与pandas的不同:
  • 创建一个 DataFrame。
  • 删除一列。
  • 删除两个特定列中包含空值的行。
  • 重命名另外两列。
  • 添加一列新数据。
样本数据如下所示:
# 导入库import numpy as npimport pandas as pdimport janitor# 示例数据company_sales = {'SalesMonth': ['Jan', 'Feb', 'Mar', 'April'],'Company1': [150.0, 200.0, 300.0, 400.0],'Company2': [180.0, 250.0, np.nan, 500.0],'Company3': [400.0, 500.0, 600.0, 675.0]}
  • Pandas:
Pandas 的 API 风格较为灵活,支持多种操作方式,包括命令式(imperative)和函数式(functional)。
# Pandas 命令式 API# 1. 从 company_sales 字典创建一个 pandas DataFramedf = pd.DataFrame.from_dict(company_sales)# 2. 删除 DataFrame 中的一列,例如 'Company1'del df['Company1']# 3. 删除 'Company2' 和 'Company3' 列中包含空值的行df = df.dropna(subset=['Company2', 'Company3'])# 4. 将 'Company2' 重命名为 'Amazon','Company3' 重命名为 'Facebook'df = df.rename(    {'Company2': 'Amazon','Company3': 'Facebook',    },    axis=1,)# 5. 为另一家公司添加一些数据,例如 'Google'df['Google'] = [450.0, 550.0, 800.0]df# 输出结果如下:#   SalesMonth  Amazon  Facebook  Google# 0        Jan   180.0     400.0   450.0# 1        Feb   250.0     500.0   550.0# 3      April   500.0     675.0   800.0
# 利用函数式 APIdf = (    pd.DataFrame(company_sales)    .drop(columns="Company1")    .dropna(subset=["Company2", "Company3"])    .rename(columns={"Company2": "Amazon", "Company3": "Facebook"})    .assign(Google=[450.0, 550.0, 800.0]))df# 输出结果与之前相同
  • pyjanitor:

pyjanitor强调“方法链”和动词化的函数名,使代码更具可读性和表达性。
与 pandas 类似,pyjanitor API 的使用也包括命令式(imperative)和函数式(functional)。
import janitor  # 导入后,函数将注册为 pandas 的一部分。# 命令式df = pd.DataFrame.from_dict(company_sales)df = df.remove_columns(["Company1"])df = df.dropna(subset=["Company2", "Company3"])df = df.rename_column("Company2", "Amazon")df = df.rename_column("Company3", "Facebook")df = df.add_column("Google", [450.0, 550.0, 800.0])df# 输出结果如下:#   SalesMonth  Amazon  Facebook  Google# 0        Jan   180.0     400.0   450.0# 1        Feb   250.0     500.0   550.0# 3      April   500.0     675.0   800.0
# 使用 pyjanitor,可以通过明确命名的动词方法实现方法链df = (    pd.DataFrame.from_dict(company_sales)    .remove_columns(["Company1"])    .dropna(subset=["Company2", "Company3"])    .rename_column("Company2", "Amazon")    .rename_column("Company3", "Facebook")    .add_column("Google", [450.0, 550.0, 800.0]))df# 输出结果如下:#   SalesMonth  Amazon  Facebook  Google# 0        Jan   180.0     400.0   450.0# 1        Feb   250.0     500.0   550.0# 3      April   500.0     675.0   800.0
03
功能:
pyjanitor当前提供的主要功能包括:
  • 清理列名(支持多级索引):
使用 clean_names 函数,自动清理列名,使其更规范(例如,转换为小写、用下划线替换空格和特殊字符)。支持处理多级列名(MultiIndex)。
import pandas as pdimport janitordata = {'First Name': ['Alice', 'Bob'], 'Last Name': ['Smith', 'Johnson']}df = pd.DataFrame(data)cleaned_df = df.clean_names()cleaned_df.columns# 输出:Index(['first_name', 'last_name'], dtype='object')
  • 删除空行和列:
remove_empty 函数可用于移除 DataFrame 里所有为空的行或列。
import pandas as pdimport janitordata = {'A': [1, None, 3], 'B': [None, None, None], 'C': [4, 5, 6]}df = pd.DataFrame(data)cleaned_df = df.remove_empty()cleaned_df# 输出:#    A     C# 0  1.0 4# 1  NaN 5# 2  3.0 6
  • 识别重复条目:
get_dupes 函数能查询出 DataFrame 中的重复行或列。
import pandas as pdimport janitordata = {'col1': [1, 2, 2, 3], 'col2': ['a', 'b', 'b', 'c']}df = pd.DataFrame(data)duplicates = df.get_dupes()duplicates# 输出:#  col1 col2# 1  2      b# 2  2      b
  • 将列编码为分类变量:
encode_categorical 函数可以将指定列转换为 Pandas 的 category 类型。
import pandas as pdimport janitordata = {'col1': [1, 2, 3], 'col2': ['a', 'b', 'a']}df = pd.DataFrame(data)# 输出:objectprint(df['col2'].dtype)df = df.encode_categorical('col2')print(df['col2'].dtype)# 输出:category
  • 将数据拆分为特征和目标(用于机器学习):
get_features_targets 函数可依据指定的列将 DataFrame 拆分为特征(X)和目标(y),便于机器学习任务。
import pandas as pdimport janitordata = {'feature1': [1, 2, 3], 'feature2': [4, 5, 6], 'target': [0, 1, 0]}df = pd.DataFrame(data)X, y = df.get_features_targets(target_column_names=["target"])print(X)print(y)# 输出:#    feature1  feature2# 0         1         4# 1         2         5# 2         3         6#    target# 0       0# 1       1# 2       0
  • 添加、删除和重命名列:
  • 添加列:用 add_column 函数。
  • 移除列:用 remove_columns 函数。
  • 重命名列:用 rename_columns 函数。
import pandas as pdimport janitordata = {'col1': [1, 2, 3]}df = pd.DataFrame(data)# 添加列df = df.add_column('col2', [4, 5, 6])# 移除列df = df.remove_columns('col1')# 重命名列df = df.rename_columns({'col2': 'new_col'})df# 输出:#  new_col# 0   4# 1   5# 2   6
  • 将多列合并为单列:
coalesce 函数可将多个列合并成一个列。
import pandas as pdimport janitordata = {'col1': [1, None, 3], 'col2': [None, 2, None]}df = pd.DataFrame(data)df = df.coalesce(['col1', 'col2'], target_column_name='merged_col')df# 输出:#  col1 col2 merged_col# 0 1.0     NaN      1.0# 1 NaN     2.0      2.0# 2 3.0     NaN      3.0
  • 将日期从 Matlab、Excel、Unix 格式转换为 Python 的 datetime 格式:
  • convert_matlab_date:把 Matlab 日期转换为 Python 的 datetime 格式。
  • convert_excel_date:把 Excel 日期转换为 Python 的 datetime 格式。
  • convert_unix_date:把 Unix 时间戳转换为 Python 的 datetime 格式。
import pandas as pdimport janitor# Excel 日期转换示例data = {'date': [43831, 43832]}df = pd.DataFrame(data)df = df.convert_excel_date('date')df# 输出:#      date# 0  2020-01-01# 1  2020-01-02
  • 将具有分隔符的单列扩展为虚拟编码变量:
expand_column 函数能将包含分隔符的分类值列(如 "A,B,C")扩展为虚拟编码变量(dummy-encoded)。
import pandas as pdimport janitordata = {'col': ['a,b', 'b,c', 'a,c']}df = pd.DataFrame(data)expanded_df = df.expand_column('col', sep=',')expanded_df# 输出:#   col a b c# 0  a,b 1 1 0# 1  b,c 0 1 1# 2  a,c 1 0 1
  • 基于分隔符连接和拆分列:
  • concatenate_columns:基于分隔符连接列。
  • deconcatenate_column:基于分隔符拆分列。
import pandas as pdimport janitordata = {'col1': ['a', 'b', 'c'], 'col2': ['d', 'e', 'f']}df = pd.DataFrame(data)# 连接列df = df.concatenate_columns(    column_names=['col1', 'col2'],    new_column_name='combined_col',    sep='_')# 拆分列df = df.deconcatenate_column('combined_col', sep='_', new_column_names=['new_col1', 'new_col2'])df# 输出:#   col1 col2 combined_col new_col1 new_col2# 0   a      d        a_d            a       d# 1   b      e        b_e            b       e# 2   c      f        c_f            c       f
  • 提供基于列查询过滤 DataFrame 的语法糖:
提供更直观的语法来过滤数据框。
  • filter_column_isin 函数用于筛选出指定列中值包含在给定列表中的行。
  • filter_date函数根据日期范围筛选行。
  • filter_on函数使用自定义的布尔表达式来筛选行。
  • filter_string函数根据字符串的匹配条件筛选行。
import pandas as pdimport janitordata = {'A': [1, 2, 3], 'B': [4, 5, 6]}df = pd.DataFrame(data)filtered_df = df.filter_column_isin('A', [2, 3])print(filtered_df)# 输出:#    A  B# 1  2  5# 2  3  6filtered_df_2 = df.filter_on('A > 1')print(filtered_df_2)# 输出:#    A  B# 1  2  5# 2  3  6
  • 提供金融、生物学、化学、工程学和 PySpark 的实验性子模块:
pyjanitor 还提供了一些实验性的子模块,专门针对特定领域的需求:
  • 金融:金融数据处理工具。
  • 生物学:生物信息学数据处理工具。
  • 化学:化学数据处理工具。
  • 工程:工程数据处理工具。
  • PySpark:与 PySpark 集成的工具。

详细的 API 可参考 pyjanitor 官方文档。

更多内容可以前往官方文档查看:

https://pyjanitor-devs.github.io/pyjanitor/

最新文章

随机文章