這20個Pandas函式可以完成80%的資料科學工作

數據分析那些事
19 min readFeb 13, 2023

--

Youssef Hosni:「20 pandas functions for 80 of your data science tasks

Pandas 是資料科學社群中使用最廣泛的庫之一,它是一個強大的工具,可以進行資料操作、清理和分析。本文將提供最常用的 Pandas 函式以及如何實際使用它們的樣例。

本文涵蓋從基本資料操作到高階資料分析技術的所有內容,到本文結束時,你會深入瞭解如何使用 Pandas 並使資料科學工作流程更高效。

1、pd.read_csv ()

read.csv用於讀取CSV(逗號分隔值)檔案並將其轉換為pandas DataFrame。

import pandas as pd
df = pd.read_csv('Popular_Baby_Names.csv')

在這個例子中,pd.read_csv函式讀取檔案’ data.csv ‘並將其轉換為一個DataFrame,它有許多選項,如sep, header, index_col, skiprows, na_values等。

df = pd.read_csv('Popular_Baby_Names.csv', sep=';', header=0, index_col=0, skiprows=5, na_values='N/A')

這個例子讀取CSV檔案data.csv,使用;作為分隔符,第一行作為標題,第一列作為索引,跳過前5行,將N/A替換為NaN。

2、df.describe ()

df.describe()方法用於生成DataFrame的各種特徵的彙總統計資訊。它返回一個新的DataFrame,其中包含原始DataFrame中每個數值列的計數、平均值、標準差、最小值、第25百分位、中位數、第75百分位和最大值。

print(df.describe())

透過向方法傳遞適當的引數,還可以包括或排除某些列,比如排除非數值列。

df.describe(include='all') # include all columns
df.describe(exclude='number') # exclude numerical columns

3、df.info ()

df.info()可以獲得DataFrame的簡明摘要,包括每列中非空值的數量、每列的資料型別以及DataFrame的記憶體使用情況。

print(df.info())

4、df.plot ()

df.plot()可以從DataFrame建立各種型別的圖。預設情況下,它在DataFrame中建立所有數值列的線狀圖。但是你也可以透過引數kind來指定你想要建立的圖形型別。可選選項有line、bar、barh、hist、box、kde、density、area、pie、scatter和hexbin

在下面的例子中,將使用.plot()方法繪製數值變數和分類變數。對於分類變數,將繪製條形圖和餅狀圖,對於數值變數,將繪製箱形圖。

df['Gender'].value_counts().plot(kind='bar')
df['Gender'].value_counts().plot(kind='pie')
df['Count'].plot(kind='box')

它還支援許多其他選項,如title, xlabel, ylabel, legend, grid, xlim, ylim, xticks, yticks等,df.plot()只是matplotlib的一個方便包裝。所以matplotlib的引數都可以在df.plot()中使用

5、df.iloc ()

.iloc()函式用於根據索引選擇行和列

# 選擇第一行
print(df.iloc[0])
# 選擇前兩行
print(df.iloc[:2])
# 選擇第一列
print(df.iloc[:, 0])
# 選擇前兩列
print(df.iloc[:, :2])
# 選擇 (1, 1) 元素
print(df.iloc[1, 1])

在上面的例子中,df.iloc[0]選擇第一行,df.iloc[:2]選擇前兩行,df.iloc[:, 0]選擇第一列,df.iloc[:, :2]選擇前兩列,df.iloc[1, 1]選擇位於(第二行,第二列)(1,1)位置的元素。

.iloc()只根據它們基於整數的索引選擇行和列,所以如果您想根據它們的標籤選擇行和列,應該使用 .loc()方法,如下所示。

6、df.loc ()

.loc()函式用於根據DataFrame中基於標籤的索引選擇行和列。它用於根據基於標籤的位置選擇行和列。

# 選擇列名“性別”
print(df.loc[:,'Gender'])
# 選擇名為“出生年份”和“性別”的列
print(df.loc[:, ['Year of Birth', 'Gender']])

在上面的例子中,df.loc[:, ['Year of Birth', 'Gender']]選擇名為’出生年份’和’性別’的列。

7、df.assign ()

.assign()函式用於根據現有列的計算向DataFrame新增新列。它允許您在不修改原始資料的情況下新增新列。該函式會返回一個添加了列的新DataFrame。

df_new = df.assign(count_plus_5=df['Count'] + 5)
df_new.head()

在上面的例子中, df.assign()第一次被用來建立一個名為’count_plus_5'的,值為count + 5的新列。

原始的df保持不變,返回新的df_new,並添加了新的列。.assign()方法可以在一個鏈中多次使用,可以在一行程式碼中新增多個新列。

8、df.query ()

.query()函式可以根據布林表示式過濾資料。可以使用類似於SQL的查詢字串從DataFrame中選擇行。該函式返回一個新的DataFrame,其中只包含滿足布林表示式的行。

# 選擇年齡大於30且收入小於65000的行
df_query = df.query('Count > 30 and Rank < 20')
df_query.head()
# 選擇性別為男性的行
df_query = df.query("Gender == 'MALE'")
df_query.head()

在上面的例子中,使用df.query()來選擇Count大於30且Rank小於30的行,第二次使用df.query()來選擇Gender為’MALE’的行。

原始的DataFrame df保持不變,df.query返回過濾後新的DataFrame。

.query()方法可以與任何有效的布林表示式一起使用,當你希望基於多個條件篩選DataFrame,或者當條件複雜且難以使用標準索引運運算元表示時,它非常有用。

另外請記住.query()方法很慢,所以如果效能很關鍵,應該儘量避免使用。

9、df.sort_values ()

.sort_values()函式可以按一列或多列對資料進行排序。它根據一個或多個列的值按升序或降序對DataFrame進行排序。該函式返回一個按指定列排序的新DataFrame。

# 按年齡升序排序
df_sorted = df.sort_values(by='Count')
df_sorted.head()
# 按收入降序排列
df_sorted = df.sort_values(by='Rank', ascending=False)
df_sorted.head()
# 按多列排序
df_sorted = df.sort_values(by=['Count', 'Rank'])
df_sorted.head()

在上面的例子中,第一次使用df.sort_values()按“Count”升序對DataFrame排序,第二次使用按“Rank”降序排序,最後一次使用按多個列“Count”和“Rank”排序。

.sort_values()方法可用於DataFrame的任何列,當希望基於多個列對DataFrame進行排序時,或者當希望按列降序對DataFrame進行排序時,它非常有用。

10、df.sample ()

.sample()函式可以從資料幀中隨機選擇行。它返回一個包含隨機選擇的行的新DataFrame。該函式採用幾個引數,可以控制取樣過程。

# 採樣 2 行不放回
df_sample = df.sample(n=2, replace=False, random_state=1)
df_sample
# 對 3 行進行替換採樣
df_sample = df.sample(n=3, replace=True, random_state=1)
df_sampl
# 採樣 2 行,不替換為要選擇的特定列
df_sample = df.sample(n=2, replace=False, random_state=1, axis=1)
df_sample

在上面的例子中,第一次使用df.sample()隨機選擇2行,第二次使用 df.sample()隨機選擇3行,最後一次使用df.sample()隨機選擇2列。

當希望隨機選擇資料子集進行測試或驗證時,或者當希望隨機選擇行樣本進行進一步分析時,.sample()方法非常有用。random_state引數對於再現性很有用,使用axis=1引數可以選擇列。

11、df.isnull ()

isnull()方法返回一個與原始DataFrame形狀相同的DataFrame,透過TrueFalse值,指示原始DataFrame中的每個值是否缺失。缺失的值NaNNone,在結果的DataFrame中將為True,而非缺失的值將為False

df.isnull()

12、df.fillna ()

fillna()方法用於用指定的值或方法填充DataFrame中的缺失值。預設情況下,它用NaN替換缺失的值,也可以指定一個不同的值來代替,一般情況下可以使用以下的引數:

🔲value:指定用來填充缺失值的值。可以是標量值,也可以是不同列的值的字典。

🔲method:指定用於填充缺失值的方法。可以是’ffill’(向前填充)或’bfill’(向後填充)或’interpolate’(插值值)或’pad’或’backfill’

🔲axis:指定填充缺失值的軸。它可以是0(行)或1(列)。

🔲inplace:是將缺失的值填充到位(修改原始的DataFrame),還是返回一個新的DataFrame。

🔲limit:指定要填充的連續缺失值的最大數量。

🔲downcast:指定一個值字典,用於向下轉換列的資料型別。

# 用0填充缺失值
df.fillna(0)

# 前向填充缺失值(將最後一個有效觀察向前傳遞到下一個)
df.fillna(method='ffill')

# 向後填充缺失值(將下一個有效觀察向後傳遞到最後一個)
df.fillna(method='bfill')

# 使用插值法填充缺失值
df.interpolate()

需要注意的是,fillna()方法返回一個新的DataFrame,並不修改原始的DataFrame。如果想修改原始的DataFrame,可以使用inplace引數並將其設定為True

# 就地填補缺失值
df.fillna(0, inplace=True)

13、df.dropna ()

df.dropna()可以從DataFrame中刪除缺失值或空值。它從DataFrame中刪除至少缺失一個元素的行或列。可以透過呼叫df.dropna()刪除包含至少一個缺失值的所有行。

df = df.dropna()

如果只想刪除包含至少一個缺失值的列,可以使用df.dropna(axis=1)

df = df.dropna(axis=1)

你還可以設定thresh引數,只保留至少具有閾值非NA/null值的行/列。

df = df.dropna(thresh=2)

14、df.drop ()

df.drop()可以透過指定的標籤從DataFrame中刪除行或列。它可以用於刪除一個或多個基於標籤的行或列。

你可以透過呼叫df.drop()來刪除特定的行,並傳遞想要刪除的行的索引標籤,並將axis引數設定為0(預設為0)。

df_drop = df.drop(0)

這將刪除DataFrame的第一行。

也可以透過傳遞一個索引標籤列表來刪除多行:

df_drop = df.drop([0,1])

這將刪除DataFrame的第一行和第二行。可以透過傳遞想要刪除的列的標籤並將axis引數設定為1來刪除列:

df_drop = df.drop(['Count', 'Rank'], axis=1)

15、pd.pivot_table ()

pd.pivot_table()可以從DataFrame建立資料透視表。透視表是一種以更有意義和更有組織的方式總結和聚合資料的表。在下面的例子中,將建立一個以Ethnicity為索引的透視表,並彙總計數的總和。這用於瞭解資料集中每個Ethnicity的計數。

pivot_table = pd.pivot_table(df, index='Ethnicity', values='Count', aggfunc='sum')
pivot_table.head()

透過指定多個索引和值引數,可以在透視表中包含更多列,還可以包括多個aggfunc函式。

pivot_table = pd.pivot_table(df, index=['Ethnicity','Gender'], values= 'Count' , aggfunc=['sum','count'])
pivot_table.head(20)

16、df.groupby ()

df.groupby()用於根據一個或多個列對DataFrame的行進行分組。並且可以對組執行聚合操作,例如計算每個組中值的平均值、和或計數。

df.groupby()返回一個GroupBy物件,然後可以使用該物件對組執行各種操作,例如計算每個組中值的和、平均值或計數。

grouped = df.groupby('Gender')
print(grouped.mean())
grouped = df.groupby(['Gender', 'Ethnicity'])
print(grouped.sum())

17、df.transpose ()

df.transpose()用於轉置DataFrame的行和列,這意味著行變成列,列變成行。

df_transposed = df.transpose()
df_transposed.head()

也可以使用df上的T屬性來實現。df.Tdf.transpose()是一樣的。

18、df.merge ()

df.merge()可以根據一個或多個公共列組合兩個dataframe。它類似於SQL join。該函式返回一個新的DataFrame,其中只包含兩個DataFrame中指定列中的值匹配的行。

# 創建第一個DataFrame
df1 = pd.DataFrame({'key': ['A', 'B', 'C', 'D'],
'value': [1, 2, 3, 4]})

# 創建第二個DataFrame
df2 = pd.DataFrame({'key': ['B', 'D', 'E', 'F'],
'value': [5, 6, 7, 8]})

# 合併 'key' 列上的兩個 DataFrame
merged_df = df1.merge(df2, on='key')

# 列印合併後的DataFrame
print(merged_df)

兩個df透過key列進行了合併,相同的列名會被新增x和y。

你也可以透過分別傳遞how = ‘ left ‘、how = ‘ right ‘或how = ‘ outer ‘來使用左連線、右連線和外連線。

還可以透過將列列表傳遞給on引數來合併多個列。

merged_df = df1.merge(df2, on=['key1','key2'])

還可以使用left_on和right_on引數指定要合併的不同列名。

merged_df = df1.merge(df2, left_on='key1', right_on='key3')

merge()函式有許多選項和引數,可以控制合併的行為,例如處理缺失的值,保留所有行還是隻保留匹配的行,合併哪些列等等。

19、df.rename ()

df.rename()可以更改DataFrame中一個或多個列或行的名稱。可以使用 columns引數更改列名,使用index引數更改行名。

# 將列 'Count' 重命名為 'count'
df_rename = df.rename(columns={'Count': 'count'})
df_rename.head()

也可以使用字典一次重新命名多個列:

df_rename = df.rename(columns={'Count': 'count', 'Rank':'rank'})
df_rename.head()

重新命名索引:

df_rename = df.rename(index={0:'first',1:'second',2:'third'})
df_rename.head()

20、df.to_csv ()

df.to_csv()可以將DataFrame匯出到CSV檔案。與上面的Read_csv作為對應。呼叫df.to_csv()將DataFrame匯出到CSV檔案:

df.to_csv('data.csv')

可以透過傳遞sep引數來指定CSV檔案中使用的分隔符。預設情況下,它被設定為“,”。

df.to_csv('path/to/data.csv', sep='\t')

也可以透過將列名列表傳遞給columns引數來只儲存DataFrame的特定列,透過將布林掩碼傳遞給索引引數來只儲存特定的行。

df.to_csv('path/to/data.csv', columns=['Rank','Count'])

還可以使用index引數指定在匯出的CSV檔案中包含或不包含dataframe的索引。

df.to_csv('path/to/data.csv', index=False)

使用na_rep引數將匯出的CSV檔案中缺失的值替換為指定的值。

df.to_csv('path/to/data.csv', na_rep='NULL')

總結

以上這20個pandas函式,絕對可以幫助我們完成80%以上的任務,我們這裡只是簡單的總結,像groupmerge等引數比較多並且常用的函式可以透過pandas的檔案進一步熟悉,這將對我們的工作有很大的幫助。

文章來源:DeepHub IMBA
文章連結:https://mp.weixin.qq.com/s/9a15G1XbZGHX5n9zi5USIA

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

我是「數據分析那些事」。常年分享數據分析乾貨,不定期分享好用的職場技能工具。各位也可以關注我的Facebook,按讚我的臉書並私訊「10」,送你十週入門數據分析電子書唷!期待你與我互動起來~

文章推薦

餅圖變形記,肝了3000字,收藏就是學會!

MySQL必須掌握4種語言!

太實用了!4種方法教你輕鬆製作互動式儀表板!

跟資料打交道的人都得會的這8種資料模型,滿足工作中95%的需求

妙呀!一行Python程式碼

回顧十週入門數據分析系列文:

關注數據君的臉書:

我是「數據分析那些事」。常年分享數據分析乾貨,不定期分享好用的職場技能工具。按贊我的臉書,會有豐富資料包贈送唷!

--

--

數據分析那些事

這是一個專注於數據分析職場的內容部落格,聚焦一批數據分析愛好者,在這裡,我會分享數據分析相關知識點推送、(工具/書籍)等推薦、職場心得、熱點資訊剖析以及資源大盤點,希望同樣熱愛數據的我們一同進步! 臉書會有更多互動喔:https://www.facebook.com/shujvfenxi/