各位python开发者/爱好者,我是 Pythonista,爱写优雅的python代码!
在AI飞速发展的今天数据科学占据了极高的地位,编写高效的 Python 代码成为一项重要的技能。
作为数据科学家,我们经常处理复杂的工作流程,在 Pandas 和 NumPy 等库之间切换以进行数据整理,使用 SQL 进行查询,以及使用 regex 进行数据清理和特征提取。
以上四种工具都是常用的,因此,了解更多关于它们的信息总是有用的。
在本文中介绍管道式(Pipeline-Style)数据清洗和处理方式,这肯定能提升您在 Pandas方面的技能。
"Talk is cheap. Show the code",开干!
python
def drop_low_freq(df, min_count):
freqs = df['category'].value_counts()
return df[df['category'].isin(freqs[freqs >= min_count].index)]
cleaned = (
pd.read_csv('data.csv', dtype={'colA': 'Int64'})
.pipe(drop_low_freq, min_count=100)
.assign(flag=lambda d: d['colB'] > d['colB'].quantile(0.9))
)
工作原理:
- .pipe() 将中间 DataFrame 直接传递到您的自定义函数中,从而保持可读性并实现链式调用。
在 Pandas 中,.pipe() 提供了一种 管道式(Pipeline-Style)数据清洗和处理方式,让多个操作可以链式组织,提高代码的可读性与可重用性,有点类似于函数式编程中的"组合函数"或 Unix 管道。
.pipe() 让你可以把一个 DataFrame "传入一个函数"中进行处理,然后继续链式处理下去。
🧠 为什么使用 .pipe()?
传统方式(嵌套多行函数)
python
df = clean_column_names(remove_outliers(normalize(df)))
使用 .pipe() 的链式方式:
python
df = (
df
.pipe(normalize)
.pipe(remove_outliers)
.pipe(clean_column_names)
)
- 更清晰易读
- 更容易复用和组合函数
🔧 基本语法
python
df.pipe(func, *args, **kwargs)
- func:一个接收 DataFrame 作为第一个参数的函数
- args 和 kwargs:其余参数
✅ 示例:使用 .pipe() 清洗数据
示例 1:简单函数链式处理
python
def drop_missing(df):
return df.dropna()
def convert_types(df):
return df.astype({'age': 'int32'})
df_clean = (
df
.pipe(drop_missing)
.pipe(convert_types)
)
示例 2:向函数传参
python
def filter_age(df, min_age):
return df[df['age'] >= min_age]
df_filtered = df.pipe(filter_age, min_age=18)
示例 3:结合多步处理
python
def clean_names(df):
df.columns = df.columns.str.strip().str.lower()
return df
def add_ratio(df):
df['ratio'] = df['value'] / df['total']
return df
df = (
df
.pipe(clean_names)
.pipe(add_ratio)
)
🧱 进阶:.pipe() 适合的函数结构
函数要遵循这样的签名:
python
def my_func(df, *args, **kwargs):
return df_modified
你甚至可以定义一个"管道构建器":
python
def make_pipeline(*funcs):
def pipeline(df):
for f in funcs:
df = f(df)
return df
return pipeline
总结:
优点 | 描述 |
---|---|
可读性高 | 多步清洗逻辑变得清晰、结构化 |
复用性好 | 函数化的数据处理模块可随意组合 |
适合团队协作 | 各步独立实现、测试、文档化更容易 |
兼容函数式风格 | 像 sklearn.pipeline 一样流畅 |
🚀 你可以把 .pipe() 理解为 Pandas 的"函数式利器",让你的数据清洗代码像流水线一样优雅。