Python受欢迎的原因之一就是其计算生态丰富,据不完全统计,Python 目前为止有约13万+的第三方库。
本系列将会陆续整理分享一些有趣、有用的第三方库。
链接:https://pan.baidu.com/s/1FSGLd7aI_UQlCQuovVHc_Q?pwd=mnsj 提取码:mnsj
https://github.com/returu/Python_Ecosystem
pyjanitor 是一个基于 Python的数据清洗和预处理库,灵感来源于 R 语言的 janitor 包。旨在简化 Pandas 数据框的操作。它提供了一系列方便的函数,使得数据清洗过程更加直观和高效。https://github.com/pyjanitor-devs/pyjanitor
本次将以以下数据清洗路径为例,对比pyjanitor与pandas的不同:# 导入库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 的 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强调“方法链”和动词化的函数名,使代码更具可读性和表达性。与 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
使用 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
- 重命名列:用 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
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_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 还提供了一些实验性的子模块,专门针对特定领域的需求:详细的 API 可参考 pyjanitor 官方文档。
更多内容可以前往官方文档查看:
https://pyjanitor-devs.github.io/pyjanitor/