---
# System prepended metadata

title: 資料D11~12：Pandas DataFrame運算/迭代
tags: [python, 資料科學馬拉松]

---

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