skip to content
Jiaxin的仓库
Table of Contents

📊 Polars vs dplyr 全面对照手册

对比 Python 的 Polars 与 R 的 dplyr 常用函数与语法。
帮助从 R 转向 Python 的分析师快速掌握 Polars。


🧠 一、总体概览

项目Polars(Python)dplyr(R)
数据结构pl.DataFrame / pl.LazyFrametibble
求值方式惰性或即时即时
表达式风格pl.col("x") + 1mutate(x = x + 1)
管道方法链或 ``
性能多线程 + Rust 内核单线程(可结合 data.table)
SQL 支持pl.SQLContextdbplyr(翻译 SQL)

⚙️ 二、数据读取与基本操作

功能dplyr / R 语法Polars 语法
读取 CSVread.csv("file.csv")pl.read_csv("file.csv")
查看前几行head(df, 5)df.head(5)
查看后几行tail(df, 5)df.tail(5)
查看列名colnames(df)df.columns
查看维度dim(df)df.shape
取列df$coldf["col"] or df.select("col")
转为 pandasN/Adf.to_pandas()
打印概要glimpse(df)df.describe()

🧩 三、数据选择与过滤

操作dplyrPolars
选择列select(df, col1, col2)df.select(["col1", "col2"])
排除列select(df, -col1)df.select(pl.exclude("col1"))
重命名列rename(df, new = old)df.rename({"old": "new"})
筛选行filter(df, x > 10)df.filter(pl.col("x") > 10)
多条件筛选filter(df, x > 10 & y == "A")df.filter((pl.col("x") > 10) & (pl.col("y") == "A"))
排序arrange(df, x)df.sort("x")
降序排序arrange(df, desc(x))df.sort("x", descending=True)
取样sample_n(df, 100)df.sample(n=100)
去重distinct(df)df.unique()
去重(按列)distinct(df, col1, col2)df.unique(subset=["col1", "col2"])

🧮 四、列操作与衍生变量(mutate 系)

功能dplyrPolars
新增列mutate(df, z = x + y)df.with_columns((pl.col("x") + pl.col("y")).alias("z"))
修改列mutate(df, x = x * 2)df.with_columns((pl.col("x") * 2).alias("x"))
多列变换mutate(across(starts_with("x"), log))df.with_columns(pl.col("^x.*$").log())
条件赋值mutate(df, flag = if_else(x > 0, 1, 0))df.with_columns(pl.when(pl.col("x") > 0).then(1).otherwise(0).alias("flag"))
替换缺失mutate(df, x = if_else(is.na(x), 0, x))df.with_columns(pl.col("x").fill_null(0))
缺失处理filter(!is.na(x))df.drop_nulls(["x"])
替换值mutate(df, x = recode(x, a=1, b=2))df.with_columns(pl.col("x").replace({"a":1, "b":2}))
类型转换mutate(df, x = as.numeric(x))df.with_columns(pl.col("x").cast(pl.Float64))

📊 五、分组与汇总(group_by / summarise)

操作dplyrPolars
分组group_by(df, g)df.group_by("g")
汇总summarise(df, mean_x = mean(x))df.select(pl.col("x").mean().alias("mean_x"))
分组汇总summarise(group_by(df, g), mean_x = mean(x))df.group_by("g").agg(pl.col("x").mean().alias("mean_x"))
多列聚合summarise(df, across(c(a, b), mean))df.select(pl.col(["a","b"]).mean())
计数count(df, g)df.group_by("g").len()
组内排序取前几slice_max(order_by = x, n = 1)df.sort("x").group_by("g").head(1)

🔗 六、数据连接(join 系)

类型dplyrPolars
内连接inner_join(df1, df2, by="id")df1.join(df2, on="id", how="inner")
左连接left_join(df1, df2, by="id")df1.join(df2, on="id", how="left")
右连接right_join(df1, df2, by="id")df1.join(df2, on="id", how="right")
全连接full_join(df1, df2, by="id")df1.join(df2, on="id", how="outer")
半连接semi_join(df1, df2, by="id")df1.join(df2, on="id", how="semi")
反连接anti_join(df1, df2, by="id")df1.join(df2, on="id", how="anti")
纵向合并bind_rows(df1, df2)pl.concat([df1, df2])
横向合并bind_cols(df1, df2)pl.concat([df1, df2], how="horizontal")

🧩 七、数据透视与变形(pivot/melt)

操作dplyr / tidyrPolars
转宽表pivot_wider(df, names_from=cat, values_from=val)df.pivot(values="val", index="id", columns="cat")
转长表pivot_longer(df, cols=c(a,b))df.melt(id_vars="id", value_vars=["a","b"])
堆叠bind_rows(df1, df2)pl.concat([df1, df2])
展平列表列unnest(df, col)df.explode("col")

🪄 八、窗口函数与排序函数

功能dplyrPolars
分组内排名mutate(rank = rank(x))df.with_columns(pl.col("x").rank().over("g"))
滚动均值mutate(ma = rollmean(x, 3))df.with_columns(pl.col("x").rolling_mean(3))
滚动和mutate(sum3 = rollsum(x, 3))df.with_columns(pl.col("x").rolling_sum(3))
累积和mutate(cumsum = cumsum(x))df.with_columns(pl.col("x").cum_sum())
累积均值mutate(cummean = cummean(x))df.with_columns(pl.col("x").cum_mean())

🔤 九、字符串操作(stringr 对照)

操作stringr / dplyrPolars
小写mutate(x = str_to_lower(x))df.with_columns(pl.col("x").str.to_lowercase())
大写mutate(x = str_to_upper(x))df.with_columns(pl.col("x").str.to_uppercase())
子串提取str_sub(x, 1, 3)pl.col("x").str.slice(0, 3)
字符长度str_length(x)pl.col("x").str.len_bytes()
模式匹配filter(str_detect(x, "A"))df.filter(pl.col("x").str.contains("A"))
字符替换mutate(x = str_replace(x, "A", "B"))pl.col("x").str.replace("A", "B")
分割separate(df, x, into=c("a","b"), sep="-")pl.col("x").str.split("-") + df.explode()

🕒 十、日期与时间函数

操作dplyr / lubridatePolars
转日期as_date(x)pl.col("x").str.strptime(pl.Date, "%Y-%m-%d")
提取年year(x)pl.col("x").dt.year()
提取月month(x)pl.col("x").dt.month()
提取日day(x)pl.col("x").dt.day()
提取星期wday(x)pl.col("x").dt.weekday()
提取小时hour(x)pl.col("x").dt.hour()
加减日期x + days(5)pl.col("x") + pl.duration(days=5)
时间差difftime(x, y)(pl.col("x") - pl.col("y"))

🧮 十一、分组管道完整示例

dplyr 写法

df %>%
filter(category == "A") %>%
group_by(region) %>%
summarise(mean_val = mean(value, na.rm = TRUE),
count = n()) %>%
arrange(desc(mean_val))