Polars 是一個速度極快的 DataFrames 庫。
它擁有以下特性:
1.多線程
2.強(qiáng)大的表達(dá)式API
3.查詢優(yōu)化
下面給大家簡單介紹一下這個模塊的使用方式蛉鹿。
1.準(zhǔn)備
請選擇以下任一種方式輸入命令安裝依賴:
1. Windows 環(huán)境 打開 Cmd (開始-運(yùn)行-CMD)流椒。
2. MacOS 環(huán)境 打開 Terminal (command+空格輸入Terminal)。
3. 如果你用的是 VSCode編輯器 或 Pycharm,可以直接使用界面下方的Terminal.
pip install polars
2.Polars 使用介紹
在初始化變量的時候详幽,Polars用起來的方式和Pandas沒有太大區(qū)別厌小,下面我們定義一個初始變量恢共,后面所有示例都使用這個變量:
import polars as pl
df = pl.DataFrame(
{
"A": [1, 2, 3, 4, 5],
"fruits": ["banana", "banana", "apple", "apple", "banana"],
"B": [5, 4, 3, 2, 1],
"cars": ["beetle", "audi", "beetle", "beetle", "beetle"],
}
)
選擇需要展示的數(shù)據(jù):
(df.select([
pl.col("A"),
"B", # the col part is inferred
pl.lit("B"), # we must tell polars we mean the literal "B"
pl.col("fruits"),
]))
效果如下:
d88818b79e6732a69974d209723d7839.png
他還能使用正則表達(dá)式篩選值并進(jìn)行求和等操作:
# 正則表達(dá)式
(df.select([
pl.col("^A|B$").sum()
]))
# 或者多選
(df.select([
pl.col(["A", "B"]).sum()
]))
效果如下:
b4ba6399433c7043e8e427d6a33106f1.png
Polars支持下面這樣復(fù)雜且高效的查詢及展示:
... [
... "fruits",
... "cars",
... pl.lit("fruits").alias("literal_string_fruits"),
... pl.col("B").filter(pl.col("cars") == "beetle").sum(),
... pl.col("A").filter(pl.col("B") > 2).sum().over("cars").alias("sum_A_by_cars"),
... pl.col("A").sum().over("fruits").alias("sum_A_by_fruits"),
... pl.col("A").reverse().over("fruits").alias("rev_A_by_fruits"),
... pl.col("A").sort_by("B").over("fruits").alias("sort_A_by_B_by_fruits"),
... ]
... )
shape: (5, 8)
┌──────────┬──────────┬──────────────┬─────┬─────────────┬─────────────┬─────────────┬─────────────┐
│ fruits ┆ cars ┆ literal_stri ┆ B ┆ sum_A_by_ca ┆ sum_A_by_fr ┆ rev_A_by_fr ┆ sort_A_by_B │
│ --- ┆ --- ┆ ng_fruits ┆ --- ┆ rs ┆ uits ┆ uits ┆ _by_fruits │
│ str ┆ str ┆ --- ┆ i64 ┆ --- ┆ --- ┆ --- ┆ --- │
│ ┆ ┆ str ┆ ┆ i64 ┆ i64 ┆ i64 ┆ i64 │
╞══════════╪══════════╪══════════════╪═════╪═════════════╪═════════════╪═════════════╪═════════════╡
│ "apple" ┆ "beetle" ┆ "fruits" ┆ 11 ┆ 4 ┆ 7 ┆ 4 ┆ 4 │
│ "apple" ┆ "beetle" ┆ "fruits" ┆ 11 ┆ 4 ┆ 7 ┆ 3 ┆ 3 │
│ "banana" ┆ "beetle" ┆ "fruits" ┆ 11 ┆ 4 ┆ 8 ┆ 5 ┆ 5 │
│ "banana" ┆ "audi" ┆ "fruits" ┆ 11 ┆ 2 ┆ 8 ┆ 2 ┆ 2 │
│ "banana" ┆ "beetle" ┆ "fruits" ┆ 11 ┆ 4 ┆ 8 ┆ 1 ┆ 1 │
└──────────┴──────────┴──────────────┴─────┴─────────────┴─────────────┴─────────────┴─────────────┘
3.Polars 高級使用
倒序操作,將值倒序后重新放回變量中璧亚,起名為xxx_reverse:
(df.select([
pl.all(),
pl.all().reverse().suffix("_reverse")
]))
53c10ee8e654336239520744221a7c1a.png
對所有列求和讨韭,并放回變量中,起名為 xxx_sum:
(df.select([
pl.all(),
pl.all().sum().suffix("_sum")
]))
4ae3ad86a8db486f6366a8d2112d92d0.png
正則也能用于篩選:
predicate = pl.col("fruits").str.contains("^b.*")
(df.select([
predicate
]))
28e6c82abfdc41546c7fed784d4d98df.png
在設(shè)定一個新列的時候癣蟋,甚至可以根據(jù)條件來給不同的行設(shè)定值:
(df.select([
"fruits",
"B",
pl.when(pl.col("fruits") == "banana").then(pl.col("B")).otherwise(-1).alias("b")
]))
0c1fd4fc79dfe5ab3ac7ecfecb5f464a.png
fold 函數(shù)很強(qiáng)大透硝,它能在列上執(zhí)行操作,獲得最快的速度疯搅,也就是矢量化執(zhí)行:
df = pl.DataFrame({
"a": [1, 2, 3],
"b": [10, 20, 30],
}
)
out = df.select(
pl.fold(acc=pl.lit(0), f=lambda acc, x: acc + x, exprs=pl.col("*")).alias("sum"),
)
print(out)
# shape: (3, 1)
# ┌─────┐
# │ sum │
# │ --- │
# │ i64 │
# ╞═════╡
# │ 11 │
# ├?????┤
# │ 22 │
# ├?????┤
# │ 33 │
# └─────┘
Polars 還有許多其他有用的特性濒生,大家感興趣的可以訪問他們的用戶手冊進(jìn)行閱讀和學(xué)習(xí):