You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 16:30:58