---
# System prepended metadata

title: Python與資料分析 HW5＆6&期末考 筆記
tags: [python, 資料分析]

---

# Python與資料分析 HW5＆6&期末考 筆記

主題：Pandas

## .iloc[... , ...]

裡面的欄列不管是否只有一個，都要用[]再包起來
才會變成DataFrame
不然會變成Series

## 欄位之間的運算

向量化運算後會是一個Series
不會加到原來的DataFrame裡面
可以用DataFrame["new"] = Series來加入
如果只是要作為filter的話 可以直接使用到原來DataFrame裡面
不一定要加入

## 砍除欄位

DataFrame名稱.drop("欄位名稱", axis=1)
axis=1代表欄

## map函數裡面放函數，只要直接放函數名稱就好

```
def change(x):
    if x == 1:
        return np.nan
    else:
        return x
allfile["ratio"] = allfile["ratio"].map(change)
```
## DataFrame內的資料讀取

若DataFrame內有Dict，想要截取其中一個key的value
可善用for迴圈+index解決
或是list comprehension

```
tricode = []

for i in range(len(file)):
    tricode.append(file[i]["teamSitesOnly"]["teamTricode"])
```

## DataFrame中搜尋某關鍵字並列出該列

先用.dtypes判斷，因為只有字串才能搜尋
用for迴圈先列出所有符合條件的欄位的True/False表
這裡會有個問題，如果欄位內容是Nan的話，搜尋判斷會是Nan
因此可以先使用pd.fillna()，括號內填充想要改成的值（字串或數值）
DataFrame名稱.drop(欄位名稱,axis=1) 可以砍掉某些欄位
（必須用東西承接，不會自動修改）

欄位名稱.str.contains若要搜尋特殊字元，則需用\n跳脫
（欄位名稱.str.replace函數就不用）

得到一些真值表之後，會使用zip函數配對
zip(*欄位們)  注意要用＊才能把所有欄位的真值表解開
最後利用any(list名稱)函數輸出每個欄位是否有關鍵字的真值表
（any裡面如果有Nan會視為True）

```
file = pd.read_csv(csv_file_path)
columns = file.columns    
file2 = file
Table = []

for i in columns:
    if file2[i].dtypes != object:
        file2 = file2.drop([i],axis = 1)

file3 = file2.fillna("No")

for i in file3.columns:
    Table.append(file3[i].str.contains("\*"))

Table2 = list(zip(*Table))
Table3 = [any(i) for i in Table2]
```
        
    return file[Table3]

## Groupby可用在兩欄位排序

將會依照順序排列，第一個欄位相同就排第二個，也可以一次group兩個欄位

`file.groupby(["Country_Region","Province_State"])[["Confirmed","Deaths"]].sum()`

## Date格式

若是一般object內的日期，無法直接排序
可以用pd.to_datetime(DataFrame名稱["欄位名稱"])讓某欄位資料變成日期格式
就可以sort了

## Groupby其他使用

groupby外面若加上list()，則可得到各種分組的DataFrame，等於是把一些DataFrame放在list裡面，要叫某個DataFrame的時候可以用index例如[]，且此list裡面的元素，每個元素的第0個index存放group的內容，第1個元素才是存放DataFrame

list(data.groupby(["confName","divName"]))[0][1]

這樣會有六組，[0]代表第一組的內容，內容包含一個tuple('East', 'Atlantic')，以及一個DataFrame

（若不用list而用DataFrame承接，則會有六列兩欄）

若要叫出六組裡面win欄位的最大值，則可

pd.DataFrame(data.groupby(["confName","divName"])["win"].max())

注意後面的["win"].max()是直接放在groupby函數後面，最後再用DataFrame表現出來




## map使用

若要用DataFrame1的內容當索引，修改DataFrame2的某欄位內容

可以先將DataFrame1的兩欄(teamId改成fullName)寫成Dic

mapp = {data11["teamId"][i]:data11["fullName"][i] for i in range(30)}

再套入DataFrame2（fullName欄位的內容被修改更新）
data["fullName"] = data["fullName"].map(mapp)
    

###### tags: `python` `資料分析`