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