5個(gè)例子比較Python Pandas 和R data.table
在這篇文章中,我們將比較Pandas 和data.table,這兩個(gè)庫(kù)是Python和R最長(zhǎng)用的數(shù)據(jù)分析包。我們不會(huì)說(shuō)那個(gè)一個(gè)更好,我們這里的重點(diǎn)是演示這兩個(gè)庫(kù)如何為數(shù)據(jù)處理提供高效和靈活的方法。
我們將介紹的示例是常見(jiàn)的數(shù)據(jù)分析和操作操作。因此,您可能會(huì)經(jīng)常使用它們。
我們將使用Kaggle上提供的墨爾本住房數(shù)據(jù)集作為示例。我將使用谷歌Colab(Pandas )和RStudio(data.table)作為開(kāi)環(huán)境。讓我們首先導(dǎo)入庫(kù)并讀取數(shù)據(jù)集。
- # pandas
- import pandas as pd
- melb = pd.read_csv("/content/melb_data.csv")
- # data.table
- library(data.table)
- melb <- fread("datasets/melb_data.csv")
示例1
第一個(gè)示例是關(guān)于基于數(shù)據(jù)集中的現(xiàn)有列創(chuàng)建新列。這是特征工程過(guò)程中常見(jiàn)的操作。這兩個(gè)庫(kù)都提供了完成此任務(wù)的簡(jiǎn)單方法。
- # pandas
- melb["Price_per_area"] = melb["Price"] / melb["Landsize"]
- # data.table
- melb[, Price_per_area := Price / Landsize]

示例2
對(duì)于第二個(gè)示例,我們通過(guò)應(yīng)用幾個(gè)過(guò)濾器創(chuàng)建原始數(shù)據(jù)集的子集。這個(gè)子集包括價(jià)值超過(guò)100萬(wàn)美元,類型為h的房子。
- # pandas
- subset = melb[(melb.Price > 1000000) & (melb.Type == "h")]
- # data.table
- subset <- melb[Price > 1000000 & Type == "h"]
對(duì)于pandas,我們提供dataframe的名稱來(lái)選擇用于過(guò)濾的列。另一方面,data.table僅使用列名就足夠了。
示例3
在數(shù)據(jù)分析中使用的一個(gè)非常常見(jiàn)的函數(shù)是groupby函數(shù)。它允許基于一些數(shù)值度量比較分類變量中的不同值。
例如,我們可以計(jì)算出不同地區(qū)的平均房?jī)r(jià)。為了使示例更復(fù)雜一些,我們還對(duì)房子類型應(yīng)用一個(gè)過(guò)濾器。
- # pandas
- melb[melb.Type == "u"].groupby("Regionname").agg(
- avg_price = ("Price", "mean")
- )
- # data.table
- melb[Type == "u", .(avg_price = mean(Price)), by="Regionname"]

pandas使用groupby函數(shù)執(zhí)行這些操作。對(duì)于data.table,此操作相對(duì)簡(jiǎn)單一些,因?yàn)槲覀冎恍枰褂胋y參數(shù)即可。
示例4
讓我們進(jìn)一步討論前面的例子。我們求出了房屋的平均價(jià)格,但不知道每個(gè)地區(qū)的房屋數(shù)量。
這兩個(gè)庫(kù)都允許在一個(gè)操作中應(yīng)用多個(gè)聚合。我們還可以按升序或降序?qū)Y(jié)果進(jìn)行排序。
- # pandas
- melb[melb.Type == "u"].groupby("Regionname").agg(
- avg_price = ("Price", "mean"),
- number_of_houses = ("Price", "count")
- ).sort_values(by="avg_price", ascending=False)
- # data.table
- > melb[
- Type == "u",
- .(avg_price = mean(Price), number_of_houses=.N),
- by="Regionname"
- ][order(-avg_price)]

我們使用計(jì)數(shù)函數(shù)來(lái)獲得每組房屋的數(shù)量。”。N”可作為data.table中的count函數(shù)。
默認(rèn)情況下,這兩個(gè)庫(kù)都按升序?qū)Y(jié)果排序。排序規(guī)則在pandas中的ascending參數(shù)控制。 data.table中使用減號(hào)獲得降序結(jié)果。
示例5
在最后一個(gè)示例中,我們將看到如何更改列名。例如,我們可以更改類型和距離列的名稱。
類型:HouseType
距離:DistanceCBD
數(shù)據(jù)集中的distance列表示到中央商務(wù)區(qū)(CBD)的距離,因此最好在列名中提供該信息。
- # pandas
- melb.rename(columns={"Type": "HouseType",
- "Distance": "DistanceCBD"},
- inplace=True)
- # data.table
- setnames(melb,
- c("Type", "Distance"),
- c("HouseType", "DistanceCBD"))
對(duì)于熊貓,我們傳遞了一個(gè)字典,該字典將更改映射到rename函數(shù)。 inplace參數(shù)用于將結(jié)果保存在原始數(shù)據(jù)幀中。
對(duì)于data.table,我們使用setnames函數(shù)。 它使用三個(gè)參數(shù),分別是表名,要更改的列名和新列名。
總結(jié)
我們比較了pandas和data.table在數(shù)據(jù)分析操作過(guò)程中常見(jiàn)的5個(gè)示例。這兩個(gè)庫(kù)都提供了簡(jiǎn)單有效的方法來(lái)完成這些任務(wù)。
在我看來(lái),data.table比pandas簡(jiǎn)單一點(diǎn)。
需要指出的是,我們?cè)诒疚闹兴龅氖纠淮砹诉@些庫(kù)功能的很小一部分。它們提供了許多函數(shù)和方法來(lái)執(zhí)行更復(fù)雜的操作。