數據科學家和軟件工程師都在用的Pandas函數有哪些?
本文轉載自公眾號“讀芯術”(ID:AI_Discovery)
軟件工程師該像是索引,而不是教科書。你無法記住所有內容,但得知道如何快速查找它們。
能夠快速查找和使用函數讓我們在編寫代碼時可以達到一定的流暢程度。因此筆者創建了這份自己每天都在使用的、用于構建網絡應用程序和機器學習模型的函數備忘清單。
它不算詳盡,但包含了筆者最常使用的函數、示例,以及該何時使用的有效見解。
1.安裝
如果想自己運行這些示例,請從Kaggle下載Anime推薦數據集,將其解壓縮并放入與jupyter notebook相同的文件夾中。
接下來運行這些指令,應該能重復得出以下任一函數的結果。
- import pandas as pd
- import numpy as npanime =pd.read_csv('anime-recommendations-database/anime.csv')
- rating = pd.read_csv('anime-recommendations-database/rating.csv')anime_modified= anime.set_index('name')
2.輸入
輸入CSV(逗號分隔值)
將CSV直接轉換為數據框。有時CSV載入數據還需要指定一種編碼(即:encoding='ISO-8859–1')。如果數據框包含不可讀的字符,應首先嘗試上述方法。
對于表格文件,存在一個叫做pd.read_excel的類似函數。
- anime =pd.read_csv('anime-recommendations-database/anime.csv')
根據輸入數據構建數據框
這在手動示例化簡單數據時十分有用,方便查看這些數據運行時如何變化。
- df = pd.DataFrame([[1,'Bob','Builder'],
- [2,'Sally', 'Baker'],
- [3,'Scott', 'CandleStick Maker']],
- columns=['id','name', 'occupation'])
- df.head()
復制數據框
想保留原始副本同時對數據框進行更改,復制數據框很有用。在輸入數據框后立即對其進行復制是很好的做法。
- anime_copy =anime.copy(deep=True)

3.查看和檢驗
獲取頂部或底部的n項記錄
顯示數據框中的前n項記錄。筆者通常在notebook中的某個位置打印數據框的頂部記錄,以便在忘記其中的內容時可以返回來參考。
- anime.head(3)
- rating.tail(1)


計算行數
這本身不是pandas函數,而是len()函數對行進行計數,并將其保存到變量中,在其他地方使用。
- len(df)
- #=> 3
計算唯一行
計算一列中的唯一值。
- len(ratings['user_id'].unique())
獲取數據框信息
對于獲取一些常規信息(如標題、值的數量和按列的數據類型)很有用。df.dtypes是一個類似但實用性低的函數,僅提供列數據類型。
- anime.info()

獲取統計數據
如果數據框具有很多數值,獲取統計數據非常有用。了解評級列的平均值,最小值和最大值,可以大致了解數據框。
- anime.describe()

獲取值總和
獲取特定列的值總和。
- anime.type.value_counts()

4.輸出
保存為CSV格式
這將轉儲到與notebook相同的目錄。筆者只保存下面的前10行,但讀者不需要這樣做。同樣,也可使用df.to_excel() 函數,將表格文件保存為CSV格式。
- rating[:10].to_csv('saved_ratings.csv',index=False)
5.選取
獲取列的值清單或一系列值。
需要將列中的值放入X和y變量中以適應機器學習模型時,此方法有效。
- anime['genre'].tolist()
- anime['genre']

- anime[‘genre’].tolist()

- anime[‘genre’]
獲取索引值列表
通過索引創建數值列表。請注意,這里使用了anime_modified數據框,因為索引值更加有趣。
- anime_modified.index.tolist()
獲取列值列表
- anime.columns.tolist()
6.添加/刪除
用設置值附加新列
偶爾,當測試集和訓練集在兩個單獨的數據框中,并想在組合它們之前分別標記出行與集的對應關系時,筆者會這樣做。
- anime['train set'] = True
從一部分列中創建新的數據框
此方法用于只想保留巨型數據框中的幾列并且不想指定刪除列時。
- anime[['name','episodes']]

刪除指定列
刪除指定列用于僅需刪除幾列時。否則,寫出全部內容可能會很乏味,筆者更喜歡前者,刪除指定列。
- anime.drop(['anime_id', 'genre','members'], axis=1).head()

添加其他行總和的一行
因其更易于查看,故在此處手動創建一個小型數據框。這里的有趣之處在于,df.sum(axis=0)將值添加到各行或各列中。
計算總和或平均值時,采用同樣的邏輯,如:
- df.mean(axis=0).
- f = pd.DataFrame([[1,'Bob',8000],
- [2,'Sally', 9000],
- [3,'Scott', 20]],columns=['id','name', 'power level'])df.append(df.sum(axis=0),ignore_index=True)

7.合并
串聯兩個數據框
用于同行有兩個數據框,并想將其組合的情況。這里將數據框分成兩部分,然后重新將它們添加在一起。
- df1 = anime[0:2]df2 =anime[2:4]pd.concat([df1, df2], ignore_index=True)



合并數據框
想將兩個數據框合并在一列時,合并數據框就如同SQL(結構化查詢語言)的左聯接用法。
- rating.merge(anime,left_on=’anime_id’, right_on=’anime_id’, suffixes=(‘_left’, ‘_right’))

8.篩選
檢索匹配索引值的行
anime_modified中的索引值是動漫的名稱。請注意,如何使用這些名稱來獲取特定列。
- anime_modified.loc[['Haikyuu!!Second Season','Gintama']]

通過編號索引值來檢索行
與上面的函數不同,使用 iloc,第一行的索引值為0,第二行的索引值為1,以此類推……即便在修改數據框后,在索引列中使用字符串值。
使用此函數,當你想獲得數據框中的前3行。
- anime_modified.iloc[0:3]

獲取行
在給定列表的列值中檢索行。匹配單個值時,anime[anime[‘type’] == 'TV']也適用。
- anime[anime['type'].isin(['TV','Movie'])]

拆分數據框
這就像拆分表格一樣。拆分數據框,來獲取在特定索引前/中/后的所有行。
- anime[1:3]

通過值篩選
篩選符合條件的行的數據框。但注意,這將維持現有的索引值。
- anime[anime['rating'] > 8]

9.排序
排序函數sort_values
按列中的值對數據框進行排序。
- anime.sort_values('rating',ascending=False)

10.匯總
分組和計數
計算列中每個不同值的記錄數。
- anime.groupby('type').count()

以不同方式對列進行分組和匯總
注意,筆者添加了 reset_index() 函數,否則,下文的“type”列將成為索引列——筆者建議在多數情況下這樣做。
- anime.groupby(["type"]).agg({
- "rating": "sum",
- "episodes":"count",
- "name": "last"
- }).reset_index()
創建數據透視表
數據透視表是比較適合從數據框中提取數據子集的工具。
需注意,筆者已對數據框進行了大量篩選,因此可以更快地構建數據透視表。
- tmp_df = rating.copy()
- tmp_df.sort_values('user_id', ascending=True, inplace=True)
- tmp_df = tmp_df[tmp_df.user_id < 10]
- tmp_df = tmp_df[tmp_df.anime_id < 30]
- tmp_df = tmp_df[tmp_df.rating != -1]pd.pivot_table(tmp_df, values='rating',index=['user_id'], columns=['anime_id'], aggfunc=np.sum, fill_value=0)

11.整理
設置非數(NaN)單元格為某個值
設置非數值單元格為0。示例中,筆者像之前一樣創建了相同的數據透視表,但不使用fill_value=0,而是使用 fillna(0)進行填充。
- pivot = pd.pivot_table(tmp_df, values='rating',index=['user_id'], columns=['anime_id'], aggfunc=np.sum)pivot.fillna(0)


12.其他
采樣數據框
筆者一直從較大的數據框中提取少量樣本。如果frac = 1,則可以在保留索引的情況下隨機重新排行。
- anime.sample(frac=0.25)

迭代行索引
在數據框中迭代索引和行。
- for idx,row inanime[:2].iterrows():
- print(idx, row)

啟動jupyter notebook
以高數據速率限制啟動jupyter notebook程序。
- jupyter notebook —NotebookApp.iopub_data_rate_limit=1.0e10
你比較喜歡哪些函數呢?