5個Pandas的高級功能


5個Pandas的高級功能


Pandas是數據分析的黃金標準庫。 擁有加載,過濾,操作和瀏覽數據的功能,因此毫無疑問它是數據科學家的最愛。

我們大多數人自然會堅持Pandas的基本知識。 從CSV文件加載數據,過濾幾列,然後直接跳入數據可視化。 然而,Pandas實際上具有許多鮮為人知但有用的功能,這些功能可以使處理數據變得更加輕鬆和整潔。

本教程將指導您完成其中5個更高級的功能-它們的作用和使用方法。 數據帶來更多樂趣!

(1)配置選項和設置

Pandas帶有一組用戶可配置的選項和設置。 它們可以極大地提高生產力,因為它們使您可以根據自己的喜好定製Pandas環境。

例如,我們可以更改某些Pandas的顯示設置,以更改顯示的行數和列數以及顯示的精度浮點數。

<code>import pandas as pd

display_settings = {
'max_columns': 10,
'expand_frame_repr': True, # Wrap to multiple pages
'max_rows': 10,
'precision': 2,

'show_dimensions': True
}

for op, value in display_settings.items():
pd.set_option("display.{}".format(op), value)/<code>

上面的代碼確保Pandas始終最多顯示10行和10列,浮點值最多顯示2個小數位。 這樣,當我們嘗試打印大的DataFrame時,我們的終端機或Jupyter Notebook不會看起來一團糟!

那只是一個基本的例子。 除了簡單的顯示設置之外,還有很多其他可以探索的內容。 您可以查看官方文檔中的所有選項。

(2)合併數據框

Pandas DataFrames的一個相對未知的部分,是實際上有2種不同的方式來組合它們。 每種方法都會產生不同的結果,因此,根據您要實現的目標選擇合適的方法非常重要。 此外,它們包含許多可進一步自定義合併的參數。 讓我們檢查一下。

級聯

串聯是組合DataFrame的最著名方法,可以直觀地認為是“堆棧”。 該堆疊可以水平或垂直進行。

假設您有一個龐大的CSV格式的數據集。 將其拆分為多個文件以便於處理是很有意義的(這是大型數據集的常見做法,稱為分片)。

將其加載到Pandas中時,您可以垂直堆疊每個CSV的DataFrame來為所有數據創建一個大的DataFrame。 例如,如果我們有3個分片,每個分片有500萬行,那麼在垂直堆疊所有分片之後,最終的DataFrame將有1500萬行。

下面的代碼顯示瞭如何在Pandas中垂直連接DataFrame。

<code># Vertical concat
pd.concat([october_df, november_df, december_df], axis=0)/<code>

您可以通過按列而不是行拆分數據集來執行類似的操作-每個CSV文件有幾列(包含數據集的所有行)。 就像我們將數據集的功能劃分為不同的碎片一樣。 然後,您將水平堆疊它們以合併那些列/要素。

<code># Horizontal concat
pd.concat([features_1to5_df, features_6to10_df, features_11to15_df], axis=1)/<code>

合併

合併更復雜但功能更強大,以類似於SQL的樣式合併Pandas DataFrame。 也就是說,DataFrames將通過一些公共屬性來合併。

想象一下,您有2個描述YouTube頻道的數據框。 其中一個包含用戶ID列表以及每個用戶在您的頻道上總共花費了多少時間。 另一個包含類似的用戶ID列表以及每個用戶觀看過多少個視頻。 合併使我們可以通過匹配用戶ID,然後將ID,花費的時間和視頻計數放在每個用戶的一行中,將2個DataFrame組合為一個。

熊貓中的兩個數據框的合併是通過合併功能完成的。 您可以在下面的代碼中看到有關其工作方式的示例。 左右參數指的是您要合併的2個數據框,而on則指定要用於匹配的列。

<code>pd.merge(left=ids_and_time_df,
right=ids_and_videos_df,
on="id")/<code>

為了進一步模擬SQL聯接,how參數可讓您選擇要執行的SQL樣式聯接的類型:內部,外部,左側或右側。 要了解有關SQL連接的更多信息,請參見W3Schools教程。

(3)重塑數據幀

有幾種方法可以重塑和重組Pandas DataFrame。 這些範圍從簡單易用到功能強大和複雜。 讓我們看看最常見的3種。 對於以下所有示例,我們將使用此超級英雄數據集!

<code>import pandas as pd

players_data = {'Player': ['Superman', 'Batman', 'Thanos', 'Batman', 'Thanos',
'Superman', 'Batman', 'Thanos', 'Black Widow', 'Batman', 'Thanos', 'Superman'],
'Year': [2000,2000,2000,2001,2001,2002,2002,2002,2003,2004,2004,2005],
'Points':[23,43,45,65,76,34,23,78,89,76,92,87]}

df = pd.DataFrame(players_data)

print(df)

"""
Player Year Points
0 Superman 2000 23
1 Batman 2000 43
2 Thanos 2000 45
3 Batman 2001 65

4 Thanos 2001 76
5 Superman 2002 34
6 Batman 2002 23
7 Thanos 2002 78
8 Black Widow 2003 89
9 Batman 2004 76
10 Thanos 2004 92
11 Superman 2005 87
"""/<code>

轉置

所有這些中最簡單的。 轉置將DataFrame的行與其列交換。 如果您有5000行和10列,然後轉置DataFrame,則最終將得到10行和5000列。

<code>df = df.T

print(df)

"""
0 1 2 3 4 5 6 7 8 9 10 11
Player Superman Batman Thanos Batman Thanos Superman Batman Thanos Black Widow Batman Thanos Superman
Year 2000 2000 2000 2001 2001 2002 2002 2002 2003 2004 2004 2005
Points 23 43 45 65 76 34 23 78 89 76 92 87

"""/<code>

分組 Group BY

Groupby的主要用途是根據某些鍵將DataFrame分為多個部分。 將DataFrame拆分為多個部分後,您可以循環瀏覽並在每個部分上獨立應用一些操作。

例如,我們可以看到在下面的代碼中如何創建具有相應年份和積分的玩家數據框。 然後,我們根據播放器進行了分組,將DataFrame分為多個部分。 因此,每個玩家都有自己的群組,顯示該玩家每年在活動中獲得的積分。

<code>groups_df = df.groupby('Player')

for player, group in groups_df:
print("----- {} -----".format(player))
print(group)
print("")

### This prints out the following
"""
----- Batman -----
Player Year Points
1 Batman 2000 43
3 Batman 2001 65
6 Batman 2002 23
9 Batman 2004 76

----- Black Widow -----
Player Year Points
8 Black Widow 2003 89

----- Superman -----
Player Year Points
0 Superman 2000 23
5 Superman 2002 34
11 Superman 2005 87

----- Thanos -----
Player Year Points
2 Thanos 2000 45
4 Thanos 2001 76
7 Thanos 2002 78
10 Thanos 2004 92

"""/<code>

堆疊 Stack

堆疊將DataFrame轉換為具有多級索引,即每行具有多個子部分。 這些子部分是使用DataFrame的列創建的,並將其壓縮為多索引。 總體而言,可以將堆棧視為將列壓縮為多索引行。

最好通過一個示例來說明,如下所示。

<code>df = df.stack()

print(df)

"""
0 Player Superman
Year 2000
Points 23
1 Player Batman
Year 2000
Points 43
2 Player Thanos
Year 2000
Points 45
3 Player Batman
Year 2001
Points 65
4 Player Thanos
Year 2001
Points 76
5 Player Superman
Year 2002
Points 34
6 Player Batman
Year 2002
Points 23
7 Player Thanos
Year 2002
Points 78
8 Player Black Widow
Year 2003
Points 89
9 Player Batman
Year 2004
Points 76
10 Player Thanos
Year 2004
Points 92
11 Player Superman
Year 2005
Points 87

"""/<code>

(4)處理時間數據

Datetime庫是Python的主要組成部分。 每當您處理與現實世界中的日期和時間信息相關的任何內容時,它都是您的轉庫。 幸運的是,Pandas還具有使用Datetime對象的功能。

讓我們舉例說明。 在下面的代碼中,我們首先創建一個包含4列的DataFrame:Day,Month,Year和data,然後按年和月對它進行排序。 如您所見,這非常混亂。 我們只用3列來存儲日期,而實際上我們知道日曆日期只是1個值。

<code>from itertools import product
import pandas as pd
import numpy as np

col_names = ["Day", "Month", "Year"]

df = pd.DataFrame(list(product([10, 11, 12], [8, 9], [2018, 2019])),
columns=col_names)

df['data'] = np.random.randn(len(df))

df = df.sort_values(['Year', 'Month'], ascending=[True, True])

print(df)


"""
Day Month Year data
0 10 8 2018 1.685356
4 11 8 2018 0.441383
8 12 8 2018 1.276089
2 10 9 2018 -0.260338
6 11 9 2018 0.404769
10 12 9 2018 -0.359598
1 10 8 2019 0.145498
5 11 8 2019 -0.731463
9 12 8 2019 -1.451633
3 10 9 2019 -0.988294
7 11 9 2019 -0.687049
11 12 9 2019 -0.067432
"""/<code>

我們可以用datetime清理事情。

Pandas方便地附帶了一個名為to_datetime()的函數,該函數可以將多個DataFrame列壓縮並將其轉換為單個Datetime對象。 採用這種格式後,就可以使用Datetime庫的所有靈活性。

要使用to_datetime()函數,您需要將相關列中的所有“日期”數據傳遞給它。 那就是“日”,“月”和“年”列。 一旦有了Datetime格式的內容,我們就不再需要其他列,只需刪除它們即可。 看看下面的代碼,看看它們如何工作!

<code>from itertools import product
import pandas as pd
import numpy as np

col_names = ["Day", "Month", "Year"]

df = pd.DataFrame(list(product([10, 11, 12], [8, 9], [2018, 2019])),
columns=col_names)

df['data'] = np.random.randn(len(df))

df = df.sort_values(['Year', 'Month'], ascending=[True, True])

df.insert(loc=0, column="date", value=pd.to_datetime(df[col_names]))
df = df.drop(col_names, axis=1).squeeze()

print(df)

"""
date data
0 2018-08-10 -0.328973
4 2018-08-11 -0.670790
8 2018-08-12 -1.360565
2 2018-09-10 -0.401973
6 2018-09-11 -1.238754
10 2018-09-12 0.957695
1 2019-08-10 0.571126
5 2019-08-11 -1.320735
9 2019-08-12 0.196036
3 2019-09-10 -1.717800
7 2019-09-11 0.074606
11 2019-09-12 -0.643198
"""/<code>

(5)將項目映射到組

映射是一個巧妙的技巧,有助於組織分類數據。 例如,想象一下,我們有一個巨大的DataFrame,其中包含成千上萬的行,其中一列包含我們要分類的項目。 這樣做可以大大簡化機器學習模型的訓練和有效地可視化數據。

請查看下面的代碼以獲取一個迷你示例,其中有我們要分類的食品列表。

<code>import pandas as pd

foods = pd.Series(["Bread", "Rice", "Steak", "Ham", "Chicken",
"Apples", "Potatoes", "Mangoes", "Fish",
"Bread", "Rice", "Steak", "Ham", "Chicken",
"Apples", "Potatoes", "Mangoes", "Fish",
"Apples", "Potatoes", "Mangoes", "Fish",
"Apples", "Potatoes", "Mangoes", "Fish",
"Bread", "Rice", "Steak", "Ham", "Chicken",
"Bread", "Rice", "Steak", "Ham", "Chicken",
"Bread", "Rice", "Steak", "Ham", "Chicken",
"Apples", "Potatoes", "Mangoes", "Fish",
"Apples", "Potatoes", "Mangoes", "Fish",
"Apples", "Potatoes", "Mangoes", "Fish",
"Bread", "Rice", "Steak", "Ham", "Chicken",
"Bread", "Rice", "Steak", "Ham", "Chicken",])

groups_dict = {
"Protein": ["Steak", "Ham", "Chicken", "Fish"],
"Carbs": ["Bread", "Rice", "Apples", "Potatoes", "Mangoes"]
}/<code>

在上面的代碼中,我們將列表放入了pandas系列。 我們還創建了一個字典,其中顯示了我們想要的映射,將每個食品分類為“蛋白質”或“碳水化合物”。 這是一個玩具的例子,但是如果這個系列是大規模的,比如說長度為1,000,000件,那麼遍歷它根本是不實際的。

除了基本的for循環,我們還可以使用Pandas內置的.map()函數編寫函數,以優化的方式執行映射。 請查看下面的代碼,以查看該功能及其應用方式。

<code>def membership_map(pandas_series, groups_dict): 

groups = {x: k for k, v in groups_dict.items() for x in v}
mapped_series = pandas_series.map(groups)
return mapped_series

mapped_data = membership_map(foods, groups_dict)
print(list(mapped_data))/<code>

在函數中,我們首先遍歷字典以創建一個新的字典,其中的鍵代表Pandas系列中每個可能的項目,其值代表新的映射項目“蛋白質”或“碳水化合物”。 然後,我們只需應用Pandas的內置map函數來映射系列中的所有值

查看下面的輸出以查看結果!

<code>['Carbs', 'Carbs', 'Protein', 'Protein', 'Protein', 'Carbs', 'Carbs', 'Carbs', 'Protein', 'Carbs', 'Carbs', 'Protein', 'Protein', 'Protein', 'Carbs', 'Carbs', 'Carbs', 'Protein', 'Carbs', 'Carbs', 'Carbs', 'Protein', 'Carbs', 'Carbs', 'Carbs', 'Protein', 'Carbs', 'Carbs', 'Protein', 'Protein', 'Protein', 'Carbs', 'Carbs', 'Protein', 'Protein', 'Protein', 'Carbs', 'Carbs', 'Protein', 'Protein', 'Protein', 'Carbs', 'Carbs', 'Carbs', 'Protein', 'Carbs', 'Carbs', 'Carbs', 'Protein', 'Carbs', 'Carbs', 'Carbs', 'Protein', 'Carbs', 'Carbs', 'Protein', 'Protein', 'Protein', 'Carbs', 'Carbs', 'Protein', 'Protein', 'Protein']
/<code>


(本文翻譯自George Seif的文章《5 Advanced Features of Pandas and How to Use Them》,參考:https://towardsdatascience.com/5-advanced-features-of-pandas-and-how-to-use-them-1f2e2585d83e)


分享到:


相關文章: