常用操作

与许多其他数据框架库一样,Polars 提供了大量的常用函数来对 Dataframe 进行操作。 熟悉 Dataframes 的用户会发现 Polars 与 PandasR 的实现有许多相似之处。

添加列

out = df.with_columns(pl.Series(["p", "q", "r", "s", "t"]).alias("e"))  # .alias方法增加一列
print(out)
shape: (5, 5)
┌──────┬──────┬──────────┬─────┬─────┐
│ a    ┆ b    ┆ c        ┆ d   ┆ e   │
│ ---  ┆ ---  ┆ ---      ┆ --- ┆ --- │
│ i64  ┆ str  ┆ f64      ┆ str ┆ str │
╞══════╪══════╪══════════╪═════╪═════╡
│ 1    ┆ foo  ┆ 0.37454  ┆ a   ┆ p   │
│ 2    ┆ ham  ┆ 0.950714 ┆ b   ┆ q   │
│ 3    ┆ spam ┆ 0.731994 ┆ c   ┆ r   │
│ null ┆ egg  ┆ 0.598658 ┆ d   ┆ s   │
│ 5    ┆ null ┆ 0.156019 ┆ e   ┆ t   │
└──────┴──────┴──────────┴─────┴─────┘

类型转换

这个例子使用的是 Python 数据类型,但我们也可以在 Polars dtypes (如 pl.Float32pl.Float64)之间进行转换。

out = df.with_columns(pl.col("a").cast(float))
print(out)
shape: (5, 4)
┌──────┬──────┬──────────┬─────┐
│ a    ┆ b    ┆ c        ┆ d   │
│ ---  ┆ ---  ┆ ---      ┆ --- │
│ f64  ┆ str  ┆ f64      ┆ str │
╞══════╪══════╪══════════╪═════╡
│ 1.0  ┆ foo  ┆ 0.37454  ┆ a   │
│ 2.0  ┆ ham  ┆ 0.950714 ┆ b   │
│ 3.0  ┆ spam ┆ 0.731994 ┆ c   │
│ null ┆ egg  ┆ 0.598658 ┆ d   │
│ 5.0  ┆ null ┆ 0.156019 ┆ e   │
└──────┴──────┴──────────┴─────┘

重命名列

import numpy as np
import polars as pl

df = pl.DataFrame(
    {
        "a": [1, 2, 3, None, 5],
        "b": ["foo", "ham", "spam", "egg", None],
        "c": np.random.rand(5),
        "d": ["a", "b", "c", "d", "e"],
    }
)

df.columns = ["banana", "orange", "apple", "grapefruit"]  # 重命名列
shape: (5, 4)
┌────────┬────────┬──────────┬────────────┐
│ banana ┆ orange ┆ apple    ┆ grapefruit │
│ ---    ┆ ---    ┆ ---      ┆ ---        │
│ i64    ┆ str    ┆ f64      ┆ str        │
╞════════╪════════╪══════════╪════════════╡
│ 1      ┆ foo    ┆ 0.155995 ┆ a          │
│ 2      ┆ ham    ┆ 0.058084 ┆ b          │
│ 3      ┆ spam   ┆ 0.866176 ┆ c          │
│ null   ┆ egg    ┆ 0.601115 ┆ d          │
│ 5      ┆ null   ┆ 0.708073 ┆ e          │
└────────┴────────┴──────────┴────────────┘

删除列


# 删除单独的列
out = df.drop("d")

# 删除多个列
out = df.drop(["b", "c"])

# 选择所有列但是不包括('b', 'c')
out = df.select(pl.all().exclude(["b", "c"]))

# 仅选择列"a"
out = df.select(pl.col("a"))
shape: (5, 1)
┌──────┐
│ a    │
│ ---  │
│ i64  │
╞══════╡
│ 1    │
│ 2    │
│ 3    │
│ null │
│ 5    │
└──────┘

删除空值

df.drop_nulls()
shape: (3, 4)
┌─────┬──────┬──────────┬─────┐
│ a   ┆ b    ┆ c        ┆ d   │
│ --- ┆ ---  ┆ ---      ┆ --- │
│ i64 ┆ str  ┆ f64      ┆ str │
╞═════╪══════╪══════════╪═════╡
│ 1   ┆ foo  ┆ 0.37454  ┆ a   │
│ 2   ┆ ham  ┆ 0.950714 ┆ b   │
│ 3   ┆ spam ┆ 0.731994 ┆ c   │
└─────┴──────┴──────────┴─────┘

填充缺失值(NA)

策略:

  • mean:平均值
  • backward:上一值
  • min:最小值
  • max:最大值
df.fill_none("forward")
shape: (5, 4)
┌─────┬──────┬──────────┬─────┐
│ a   ┆ b    ┆ c        ┆ d   │
│ --- ┆ ---  ┆ ---      ┆ --- │
│ i64 ┆ str  ┆ f64      ┆ str │
╞═════╪══════╪══════════╪═════╡
│ 1   ┆ foo  ┆ 0.37454  ┆ a   │
│ 2   ┆ ham  ┆ 0.950714 ┆ b   │
│ 3   ┆ spam ┆ 0.731994 ┆ c   │
│ 3   ┆ egg  ┆ 0.598658 ┆ d   │
│ 5   ┆ egg  ┆ 0.156019 ┆ e   │
└─────┴──────┴──────────┴─────┘

获取所有列

df.columns
['a', 'b', 'c', 'd']

空值计数

df.null_count()
shape: (1, 4)
┌─────┬─────┬─────┬─────┐
│ a   ┆ b   ┆ c   ┆ d   │
│ --- ┆ --- ┆ --- ┆ --- │
│ u32 ┆ u32 ┆ u32 ┆ u32 │
╞═════╪═════╪═════╪═════╡
│ 1   ┆ 1   ┆ 0   ┆ 0   │
└─────┴─────┴─────┴─────┘

列排序

df.sort("a", reverse=True)
shape: (5, 4)
┌──────┬──────┬──────────┬─────┐
│ a    ┆ b    ┆ c        ┆ d   │
│ ---  ┆ ---  ┆ ---      ┆ --- │
│ i64  ┆ str  ┆ f64      ┆ str │
╞══════╪══════╪══════════╪═════╡
│ null ┆ egg  ┆ 0.598658 ┆ d   │
│ 5    ┆ null ┆ 0.156019 ┆ e   │
│ 3    ┆ spam ┆ 0.731994 ┆ c   │
│ 2    ┆ ham  ┆ 0.950714 ┆ b   │
│ 1    ┆ foo  ┆ 0.37454  ┆ a   │
└──────┴──────┴──────────┴─────┘

转为 NumPy

df.to_numpy()
[[1.0 'foo' 0.3745401188473625 'a']
 [2.0 'ham' 0.9507143064099162 'b']
 [3.0 'spam' 0.7319939418114051 'c']
 [nan 'egg' 0.5986584841970366 'd']
 [5.0 None 0.15601864044243652 'e']]

转为 Pandas

df.to_pandas()
     a     b         c  d
0  1.0   foo  0.374540  a
1  2.0   ham  0.950714  b
2  3.0  spam  0.731994  c
3  NaN   egg  0.598658  d
4  5.0  None  0.156019  e