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,透過True
或False
值,指示原始DataFrame中的每個值是否缺失。缺失的值NaN
或None
,在結果的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.T
和df.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%以上的任務,我們這裡只是簡單的總結,像group
,merge
等引數比較多並且常用的函式可以透過pandas的檔案進一步熟悉,這將對我們的工作有很大的幫助。
文章來源:DeepHub IMBA
文章連結:https://mp.weixin.qq.com/s/9a15G1XbZGHX5n9zi5USIA
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
我是「數據分析那些事」。常年分享數據分析乾貨,不定期分享好用的職場技能工具。各位也可以關注我的Facebook,按讚我的臉書並私訊「10」,送你十週入門數據分析電子書唷!期待你與我互動起來~
文章推薦
◆跟資料打交道的人都得會的這8種資料模型,滿足工作中95%的需求
回顧十週入門數據分析系列文:
關注數據君的臉書:
我是「數據分析那些事」。常年分享數據分析乾貨,不定期分享好用的職場技能工具。按贊我的臉書,會有豐富資料包贈送唷!