如何用Python实现类R Tidyverse的管道式鸢尾花数据处理?
Python 管道式实现鸢尾花数据集处理(对标R Tidyverse)
以下是完全对标R Tidyverse管道风格的Python实现,基于pandas原生链式操作,全程无分步变量赋值、无apply函数:
import pandas as pd import numpy as np from seaborn import load_dataset # 一站式管道操作,完全对应需求的5个步骤 final_result = ( # 1. 导入鸢尾花数据集 load_dataset("iris") # 2. 生成target_measure列:ln(Sepal.Width) × (Petal.Width)² .assign( target_measure=lambda df: np.log(df["sepal_width"]) * (df["petal_width"] ** 2) ) # 3. 生成categorical_measure列,按阈值分三类 .assign( categorical_measure=lambda df: pd.cut( df["target_measure"], bins=[-np.inf, 1.5, 3.5, np.inf], labels=["<1.5", "1.5-3.5", "out of target"] ) ) # 4. 按Species分组,计算指定均值和分类计数 .groupby("species", as_index=False) .agg( sepal_width_mean=("sepal_width", "mean"), petal_width_mean=("petal_width", "mean"), # 自动生成三个分类的计数列 **{ cat: ("categorical_measure", lambda x: (x == cat).sum()) for cat in ["<1.5", "1.5-3.5", "out of target"] } ) # 5. 筛选"out of target"计数≥5的行 .query("`out of target` >= 5") ) # 查看结果 print(final_result)
关键细节说明:
- 用括号包裹整个操作链,完美对标R的
%>%管道语法,所有操作连贯执行 assign()方法用于新增列,通过lambda引用当前DataFrame,避免分步保存中间变量pd.cut()直接完成数值分箱,一步生成分类标签列groupby().agg()通过关键字参数+字典推导式,一次性完成多指标聚合,替代繁琐的apply循环query()方法用类SQL语法筛选行,简洁度对标dplyr的filter()
如果追求更贴近Tidyverse的pipe命名风格,可以借助pyjanitor库(需先安装pip install pyjanitor):
import pandas as pd import numpy as np from seaborn import load_dataset from janitor import pipe final_result = ( load_dataset("iris") .pipe(lambda df: df.assign(target_measure=np.log(df["sepal_width"]) * (df["petal_width"]**2))) .pipe(lambda df: df.assign(categorical_measure=pd.cut(df["target_measure"], bins=[-np.inf,1.5,3.5,np.inf], labels=["<1.5","1.5-3.5","out of target"]))) .groupby("species", as_index=False) .agg( sepal_width_mean=("sepal_width", "mean"), petal_width_mean=("petal_width", "mean"), count_lt_15=("categorical_measure", lambda x: (x=="<1.5").sum()), count_15_35=("categorical_measure", lambda x: (x=="1.5-3.5").sum()), count_out_target=("categorical_measure", lambda x: (x=="out of target").sum()) ) .query("count_out_target >=5") )
内容的提问来源于stack exchange,提问作者R_Student
相关产品推荐
相关产品推荐

