點擊上方圖片,查看教學大綱
如何用pandas處理大數據學習「between」、「reindex」等功能。這5個pandas的功能是非常有用的,但有時候卻被人忽略
between 函數多年來我一直在SQL中使用「between」函數,但直到最近才在pandas中發現它。
假設我們有一個帶有價格的DataFrame,我們想要過濾2到4之間的價格。
df = pd.DataFrame({'price': [1.99, 3, 5, 0.5, 3.5, 5.5, 3.9]})使用between功能,您可以減少此過濾器:
df[(df.price >= 2) & (df.price <= 4)]使用between
df[df.price.between(2, 4)]它看起來可能不多,但是當編寫許多過濾器時,這些括號很煩人。帶有between函數的過濾器也更具可讀性。
函數集合都是有等號的:左<=series<=右
用reindex函數修正行順序重索引函數為一個序列或一個數據文件生成一個新索引。在生成具有預定義順序的列的報告時,我使用reindex函數。
讓我們把t恤的尺寸添加到我們的資料庫裡。分析的目的是計算每種尺寸的平均價格:
df = pd.DataFrame({'price': [1.99, 3, 5], 'size': ['medium', 'large', 'small']})df_avg = df.groupby('size').price.mean()
df_avg在上表中,大小的順序是隨機的。應該訂小杯、中杯、大杯。由於大小是字符串,我們不能使用sort_values函數。這裡有一個重新索引函數:
df_avg.reindex(['small', 'medium', 'large'])通過在reindex函數中指定大小的順序,使得結果更容易解釋。
Describe函數描述函數是進行探索性數據分析時必不可少的工具。它顯示了DataFrame中所有列的基本匯總統計信息。
df.price.describe()如果我們想計算10個分位數而不是3個呢?
df.price.describe(percentiles=np.arange(0, 1, 0.1))描述函數接受百分比參數。我們可以使用NumPy的arange函數指定百分比數,以避免手工輸入每個百分比。
當與group by功能結合時,這個功能變得非常有用:
df.groupby('size').describe(percentiles=np.arange(0, 1, 0.1))使用正則表達式進行文本搜索我們的t恤數據集有3種尺寸。假設我們想要過濾小的和中號的。一種繁瑣的過濾方式是:
df[(df['size'] == 'small') | (df['size'] == 'medium')]這很糟糕,因為我們通常將其與其他過濾器結合在一起,這使得表達式不可讀。有更好的方法嗎?
pandas字符串列有一個「str」訪問器,它實現了許多簡化字符串操作的函數。其中之一是「contains」函數,它支持使用正則表達式進行搜索。
df[df['size'].str.contains('small|medium')]帶有「contains」函數的過濾器可讀性更強,更容易擴展和與其他過濾器組合。
大內存數據集pandas甚至不能讀取比主內存數據集更大的數據。它拋出MemoryError或內核崩潰。但是要處理一個大數據集,你不需要Dask或Vaex這樣的包,只需要一些小技巧。
iter_csv = pd.read_csv('dataset.csv', iterator=True, chunksize=1000)
df = pd.concat([chunk[chunk['field'] > constant] for chunk in iter_csv])分塊讀取數據集比一次全部讀取要慢。我建議只在大於內存數據集的情況下使用這種方法。
在這種情況下,你不需要所有的列,你可以指定需要的列「usecols」參數時,讀取數據集:
df = pd.read_csv('file.csv', usecols=['col1', 'col2'])這兩種方法的好處是可以將它們組合在一起。
作者:Roman Orac
deephub翻譯組