Pandas
本篇網址:https://hackmd.io/@wiimax/10-minutes-to-pandas
來自Pandas官方文件,原文詳見: https://pandas.pydata.org/pandas-docs/stable/user_guide/10min.html
Pandas 提供了兩種類型的類別來處理資料:
通過傳入一個list創建Series,pandas預設會產生整數的RangeIndex。
DataFrame
透過使用帶有標籤的list傳遞帶有日期時間索引的 NumPy 數組來建立date_range()
:
np.random.randn(6, 4)
是一個 NumPy 函數,用於生成一個形狀為 (6, 4) 的數組,其中的元素來自於標準常態分佈(均值為 0,標準差為 1)。這個函數是為了方便從 Matlab 移植代碼而設計的,並且將標準常態分佈的生成封裝在了standard_normal
函數中。
DataFrame
以字典dict
:{Key:Value}
創建DataFrame
,其中Key是欄(非列)標籤、Value是列之值。
如果用IPython、Jupyter notebook等筆記本形式使用Tab
可自動展示補全所有的屬性、自定義欄位。
以DataFrame.head()
查看DataFrame的前n筆資料,DataFrame.tail()
查看最後n筆資料:
以DataFrame.index
、DataFrame.columns
顯示索引及欄位名稱。
DataFrame.to_numpy()
轉換為NumPy
。
但請注意如果該
DataFrame
具有不同資料型態(int、str…),這可能是一項昂貴的操作,主因是NumPy數組對整個數組有一個dtype,而pandas DataFrames每列有一個dtype。當呼叫時 DataFrame.to_numpy(),pandas會找到可以容納 DataFrame中所有 dtypes 的NumPy dtype。這可能最終成為object,這需要將每個值都轉換為Python物件。
以下df的DataFrame值皆為浮點數, DataFrame.to_numpy()
就相當快。
以下df2的DataFrame
有不同dtypes
,運算代價高
Note DataFrame.to_numpy() does not include the index or column labels in the output.
以describe()
快速檢視數據統計摘要
pd.series.std(ddof=1)
預設為樣本的標準差,如果要像numpy.std
以母體為標準差,應改為pd.series.std(ddof=0)
以T
轉置資料矩陣(列、欄互換)
依軸排序sort_index(axis=1, ascending=False)
,結果為以ROW、遞增排序。
注意,雖然標準的
Python
、numpy
表達式直觀可用,但建議以Pandas
優化的選擇方法,如DataFrame.at()
、DataFrame.iat()
和 。DataFrame.loc()
DataFrame.iloc()
。
參閱文件Indexing and Selecting Data and MultiIndex / Advanced Indexing.
DataFrame
選取單一欄位,將會回傳一個Series
, df['A']
相當於df.A
:
以中括號[]
選擇想要的rows進行切片
請參閱按標籤選擇了解更多內容。DataFrame.loc()
DataFrame.at()
選擇與標籤相符的行:
以標籤取得多欄位數據
以標籤組合切片:
以標籤組合縮減顯示維度:
獲取單筆數值:
快速存取標量(相當於先前的方法):
loc
以標籤取得Rows數據,iloc
以行號取得數據。
在Selection by Position查看更多內容。DataFrame.iloc()
DataFrame.iat()
以整數數值選擇:
以整數切片,使用方式類似numpy
、python
風格:
以list指定位置,使用方式類似numpy
、python
風格:
對行rows切片:
對欄columns切片:
取得特定值:
快速取得特定值(相當於先前的方法):
以單欄的值選取數據
顯示DataFrame滿足布林條件的情形
以isin()
方法篩選數據:
df.copy()
預設為df.copy(deep=True)
,意思是預設執行深Copy
深複製:創建一個新的物件,並且徹底複製原始物件中的所有數據。深複製後,原始數據和新複製的數據互不影響,它們在記憶體中是完全獨立的。
淺複製:創建一個新的物件,但是不會徹底複製數據,只是複製數據的引用。淺複製後,原始數據和新複製的數據會相互影響,因為它們共享同一塊記憶體中的數據。
df2 = df
會是淺複製,df2
的任何改動也會變更df
,因為是同一筆數據集。
設定新列會自動按索引對齊資料:
以標籤更新數值:
以位置更新數值:
以NumPy array更新
df依前述操作更新結果
以where
條件判斷運算子更新值
pandas
以np.nan
表示缺失值,預設情況不進行運算,參閱 Missing Data section
.reindex()
可以修改/增加/刪除索引,將回傳一個數據的副本
丟掉有區失值的行
對缺失值賦值
以.isna()
使用布林遮罩
操作通常不包含缺失項(缺失要先預處理)
執行敘述統計-按列
執行敘述統計-按欄
Series或DataFrame如要操作不同維度需先對齊,Pandas會自動沿著指定維度廣播(broadcasting),並且會用np.nan
填滿未對齊的標籤。
應用DataFrame.agg()
、DataFrame.transform()
使用者定義的函數來分別減少或廣播其結果。
更多資訊請參見直方圖和離散化。
str
的處理方法 ,可以方便地對數組的每個元素進行操作,如下面的程式碼片段所示。請參閱向量化字串方法以了解更多資訊。pandas提供各種簡易的合併Series及Dataframe物件操作方式,參閱Merging section
以concat()
連接pandas物件:
向DataFrame新增"Column"相對較快。但是,添加"Row"需要copy副本,並且可能很昂貴。我們建議將預先建立的記錄列表傳遞給DataFrame建構函數,而不是DataFrame透過迭代地向其追加記錄來建構。
merge() 可以採用SQL style合併。參閱Database style joining章節。
merge()唯一值:
透過“group by”將數據對每個分組應用不同的function並結合展示成果,過程為:
參閱Grouping章節.
按列標籤分組,選擇列標籤,然後將 DataFrameGroupBy.sum()函數套用至結果組:
以多欄位分組形成分層索引,並應用sum()
參閱Hierarchical Indexing and Reshaping章節內容
分層資料結構的形式
使用stack()方法將DataFrame壓縮(compresses) 為階層形式的欄位
使用堆疊的DataFrame或Series(具有階層索引MultiIndex),與stack()
相反的操作為unstack()
,預設情況下為取消堆疊最後一級:
我們可以非常輕鬆地從這些數據生成數據透視表:
pandas具有簡單,強大且高效的功能,用於在頻率轉換期間執行重採樣操作(例如,將第二數據轉換為5分鐘數據)。這在財務應用程序中非常常見,但不僅限於此。請參閱Time Series章節
時區呈現:
Series.tz_convert()將轉換為另一個時區:轉換為另一個時區:
BusinessDay在不同時間跨度表示間轉換:
現在pandas可以在DataFrame中包含分類數據,詳情參閱categorical introduction 及API documentation.
將原始成績轉換為分類數據
重命名分類使其更有意義(使用 Series.cat.categories
轉換).
重新整理類別,並添加缺少的類別(預設為回傳新 Series).
按整理後的類別排序.sort_values()
按類別分類也會包含具空值的類別
請參閱Plotting文檔。
此plt.close方法用於關閉圖形視窗:
使用 Jupyter 時,繪圖將使用 出現plot()。否則使用 matplotlib.pyplot.show顯示它或 matplotlib.pyplot.savefig將其寫入檔案。
在DataFrame上,該plot()
方法可以方便地使用標籤繪製所有列:
讀寫MS Excel
寫入excel檔案DataFrame.to_excel()
讀取excel檔案read_excel()
如果操作時遇到異常,如:
請查看Comparisons來處理異常,或查看Gotchas也可以.