Polars 速度極快的數(shù)據(jù)處理第三方模塊

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í):

https://pola-rs.github.io/polars-book/user-guide

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市幔欧,隨后出現(xiàn)的幾起案子罪治,更是在濱河造成了極大的恐慌,老刑警劉巖礁蔗,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件觉义,死亡現(xiàn)場離奇詭異,居然都是意外死亡浴井,警方通過查閱死者的電腦和手機(jī)晒骇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來磺浙,“玉大人洪囤,你說我怎么就攤上這事⊥犁裕” “怎么了箍鼓?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長呵曹。 經(jīng)常有香客問我款咖,道長,這世上最難降的妖魔是什么奄喂? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任铐殃,我火速辦了婚禮,結(jié)果婚禮上跨新,老公的妹妹穿的比我還像新娘富腊。我一直安慰自己,他們只是感情好域帐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布赘被。 她就那樣靜靜地躺著是整,像睡著了一般。 火紅的嫁衣襯著肌膚如雪民假。 梳的紋絲不亂的頭發(fā)上浮入,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機(jī)與錄音羊异,去河邊找鬼事秀。 笑死,一個胖子當(dāng)著我的面吹牛野舶,可吹牛的內(nèi)容都是我干的易迹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼平道,長吁一口氣:“原來是場噩夢啊……” “哼睹欲!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起巢掺,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤句伶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后陆淀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體考余,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年轧苫,在試婚紗的時候發(fā)現(xiàn)自己被綠了楚堤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡含懊,死狀恐怖身冬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情岔乔,我是刑警寧澤酥筝,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站雏门,受9級特大地震影響嘿歌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜茁影,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一宙帝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧募闲,春花似錦步脓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽仍侥。三九已至,卻和暖如春蚁廓,著一層夾襖步出監(jiān)牢的瞬間访圃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工相嵌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人况脆。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓饭宾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親格了。 傳聞我的和親對象是個殘疾皇子看铆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容