# 資料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

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

###### tags: `資料科學馬拉松` `python`