# 資料D11~12:Pandas DataFrame運算/迭代 https://pandas.pydata.org/pandas-docs/stable/user_guide/10min.html ## DataFrame基本算術運算 ### 格式、欄位名稱一樣可直接相加減+廣播特性 如Df1 + Df2 若欄位名稱不一樣,會有錯誤的結果,例如出現Nan 廣播特性:如Df+1代表裡面的值全部+1(自動廣播成全部都是1的Df) (只能廣播常數,不能廣播Df,numpy可以廣播array) ## DataFrame排序 DataFrame名稱.sort_values(by='欄位名稱') 若兩個以上的欄位,可用list包起來(依照list順序排序) 預設升序 ascending=True ## DataFrame統計方法 預設都是針對欄運算axis=0,若想要針對行可以輸入axis=1 ![](https://i.imgur.com/YlBrKnJ.png) DaraFrame名稱.count() 非空元素個數 DaraFrame名稱.min() 最小值 DaraFrame名稱.max() 最大值 DaraFrame名稱.idxmin() 最小值的索引 DaraFrame名稱.idxmax() 最大值的索引 DaraFrame名稱.quantile(a) a百分位數 DaraFrame名稱.sum() 和 DaraFrame名稱.mean() 平均 若指定欄位的話,可用DaraFrame名稱.欄位名稱.mean() 若想聚合欄位再平均,可用DaraFrame名稱.groupby("欄位名稱").mean DaraFrame名稱.median() 中位數 DaraFrame名稱.mode() 眾數 DaraFrame名稱.var() 變異數 DaraFrame名稱.std() 標準差 DaraFrame名稱.corr() 相關係數(預設會兩兩欄位都計算並以圖表顯示) DaraFrame名稱.mad() 平均絕對偏差 DaraFrame名稱.skew() 偏度 DaraFrame名稱.kurt() 峰度 DaraFrame名稱.describe() 敘述性統計資訊 ## DataFrame的字串方法 DaraFrame名稱.str.findall() :對所有欄位的找尋批配文字(類似re.findall()) DaraFrame名稱.str.replace() :對所有欄位的文字進行取代 DaraFrame名稱.str.contains() :對所有欄位的文字進行包含子字串的檢查 DaraFrame名稱.str.count() :對所有欄位的文字進行計數操作 DaraFrame名稱.str.split() :對所有欄位的文字進行分割操作 ## DataFrame自定義函式 DataFrame名稱.apply(lambda x : x的函式計算) 例如 `df.apply(lambda x : (x**0.5)*10)` 可將DataFrame裡面都做此運算 DataFrame名稱.apply(pandas統計方法) 例如 `df.apply(sum, axis=1)` ## DataFrame迭代 https://pythonbasics.org/pandas-iterate-dataframe/ ### DataFrame直接for迴圈 ``` for i in df: print(i) ``` 只會輸出df的所有欄位 ### 用for迴圈取得橫向資料 ``` for i in range(len(df)): print(df.iloc[i]) #iloc可省略欄位表示取出所有欄位 ``` ### DataFrame內建取得橫向資料 iteritems() 以欄位為單位一行一行列出 iterrows() 橫向一列一列列出 itertuples() 橫向列出且"分別"用tuple包裝 ``` for d in df.iteritems(): print(d) ``` ('name', 0 Alice 1 Bob Name: name, dtype: object) ('age', 0 20 1 32 Name: age, dtype: int64) ``` for d in df.iterrows(): print(d) ``` (0, name Alice age 20 Name: 0, dtype: object) (1, name Bob age 32 Name: 1, dtype: object) ``` for d in df.itertuples(): print(d) ``` Pandas(Index=0, name='Alice', age=20) Pandas(Index=1, name='Bob', age=32) ### 利用apply迭代DataFrame的行列 可逐行或逐列操作(看函式方法而定) DataFrame名稱.apply(某個內建函式方法) DataFrame名稱.apply(lambda x: 與x有關的算式或內建函式組合) ### 利用map迭代series所有元素 只用於series,做逐元素操作 Series名稱.map(lambda x: 與x有關的算式或內建函式組合) (可用DataFrame名稱["欄位名稱"] 作為一個series) ### 利用applymao迭代DataFrame所有元素 用於DataFrame,做逐元素操作 DataFrame名稱.map(lambda x: 與x有關的算式或內建函式組合) ** 裡面也可以放自訂函式 ``` def f(x): return x.max() - x.min() print(df.apply(f)) ``` 可取代 print(df.apply(lmabda x: x.max()-x.min())) ** lambda參考資料 https://openhome.cc/Gossip/Python/LambdaExpression.html https://www.learncodewithmike.com/2019/12/python-lambda-functions.html ![](https://i.imgur.com/27BWcnv.png) ###### tags: `資料科學馬拉松` `python`