目錄: 讀取數據 索引 選擇數據 簡單運算 聲明,本文引用於:https://www.dataquest.io/mission/8/introduction-to-pandas (建議閱讀原文) Pandas使用一個二維的數據結構DataFrame來表示表格式的數據,相比較於Numpy,Pandas...
目錄:
讀取數據
索引
選擇數據
簡單運算
聲明,本文引用於:https://www.dataquest.io/mission/8/introduction-to-pandas (建議閱讀原文)
Pandas使用一個二維的數據結構DataFrame來表示表格式的數據,相比較於Numpy,Pandas可以存儲混合的數據結構,同時使用NaN來表示缺失的數據,而不用像Numpy一樣要手工處理缺失的數據,並且Pandas使用軸標簽來表示行和列
讀取數據
Pandas使用函數read_csv()來讀取csv文件
import pandas food_info = pandas.read_csv('food_info.csv') print(type(food_info))
# 輸出:<class 'pandas.core.frame.DataFrame'> 可見讀取後變成一個DataFrame變數
該文件的內容如下:
使用函數head( m )來讀取前m條數據,如果沒有參數m,預設讀取前五條數據
first_rows = food_info.head()
first_rows = food_info.head(3)
由於DataFrame包含了很多的行和列,Pandas使用省略號(...)來代替顯示全部的行和列,可以使用colums屬性來顯示全部的列名
print(food_info.columns)
# 輸出:輸出全部的列名,而不是用省略號代替
Index(['NDB_No', 'Shrt_Desc', 'Water_(g)', 'Energ_Kcal', 'Protein_(g)', 'Lipid_Tot_(g)', 'Ash_(g)', 'Carbohydrt_(g)', 'Fiber_TD_(g)', 'Sugar_Tot_(g)', 'Calcium_(mg)', 'Iron_(mg)', 'Magnesium_(mg)', 'Phosphorus_(mg)', 'Potassium_(mg)', 'Sodium_(mg)', 'Zinc_(mg)', 'Copper_(mg)', 'Manganese_(mg)', 'Selenium_(mcg)', 'Vit_C_(mg)', 'Thiamin_(mg)', 'Riboflavin_(mg)', 'Niacin_(mg)', 'Vit_B6_(mg)', 'Vit_B12_(mcg)', 'Vit_A_IU', 'Vit_A_RAE', 'Vit_E_(mg)', 'Vit_D_mcg', 'Vit_D_IU', 'Vit_K_(mcg)', 'FA_Sat_(g)', 'FA_Mono_(g)', 'FA_Poly_(g)', 'Cholestrl_(mg)'], dtype='object')
可以使用tolist()函數轉化為list
food_info.columns.tolist()
與Numpy一樣,用shape屬性來顯示數據的格式
dimensions = food_info.shape print(dimensions)
輸出:(8618,36) 表示這個表格有8618行和36列的數據,其中dimensions[0]為8618,dimensions[1]為36
與Numpy一樣,用dtype屬性來顯示數據類型,Pandas主要有以下幾種dtype:
- object -- 代表了字元串類型
- int -- 代表了整型
- float -- 代表了浮點數類型
- datetime -- 代表了時間類型
- bool -- 代表了布爾類型
當讀取了一個文件之後,Pandas會通過分析值來推測每一列的數據類型
print(food_info.dtypes)
輸出:每一列對應的數據類型
NDB_No int64
Shrt_Desc object
Water_(g) float64
Energ_Kcal int64
Protein_(g) float64
...
索引
讀取了文件後,Pandas會把文件的一行作為列的索引標簽,使用行數字作為行的索引標簽
註意,行標簽是從數字0開始的
Pandas使用Series數據結構來表示一行或一列的數據,類似於Numpy使用向量來表示數據。Numpy只能使用數字來索引,而Series可以使用非數字來索引數據,當你選擇返回一行數據的時候,Series並不僅僅返回該行的數據,同時還有每一列的標簽的名字。
譬如要返迴文件的第一行數據,Numpy就會返回一個列表(但你可能不知道每一個數字究竟代表了什麼)
而Pandas則會同時把每一列的標簽名返回(此時就很清楚數據的意思了)
選擇數據
Pandas使用loc[]方法來選擇行的數據
# 選擇單行數據: food_info.loc[0] # 選擇行標號為0的數據,即第一行數據 food_info.loc[6] # 選擇行標號為6的數據,即第七行數據 # 選擇多行數據: food_info.loc[3:6] # 使用了切片,註意:由於這裡使用loc[]函數,所以返回的是行標號為3,4,5,6的數據,與python的切片不同的是這裡會返回最後的標號代表的數據,但也可以使用python的切片方法: food_info[3:7] food_info.loc[[2,5,10]] # 返回行標號為2,5,10三行數據 練習:返迴文件的最後五行 方法一: length = food_info.shape[0] last_rows = food_info.loc[length-5:length-1] 方法二: num_rows = food_info.shape[0] last_rows = food_info[num_rows-5:num_rows] Pandas直接把列名稱填充就能返回該列的數據 ndb_col = food_info["NDB_No"] # 返回列名稱為NDB_No的那一列的數據 zinc_copper = food_info[["Zinc_(mg)", "Copper_(mg)"]] # 返回兩列數據
簡單運算
現在要按照如下公式計算所有食物的健康程度,並按照降序的方式排列結果:
Score=2×(Protein_(g))−0.75×(Lipid_Tot_(g))
對DataFrame中的某一列數據進行算術運算,其實是對該列中的所有元素進行逐一的運算,譬如:
water_energy = food_info["Water_(g)"] * food_info["Energ_Kcal"]
原理:
由於每一列的數據跨度太大,有的數據是從0到100000,而有的數據是從0到10,所以為了儘量減少數據尺度對運算結果的影響,採取最簡單的方法來規範化數據,那就是將每個數值都除以該列的最大值,從而使所有數據都處於0和1之間。其中max()函數用來獲取該列的最大值
food_info['Normalized_Protein'] = food_info['Protein_(g)'] / food_info['Protein_(g)'].max() food_info['Normalized_Fat'] = food_info['Lipid_Tot_(g)'] / food_info['Lipid_Tot_(g)'].max() food_info['Norm_Nutr_Index'] = food_info["Normalized_Protein"] * 2 - food_info["Normalized_Fat"] * 0.75 註意:上面的兩個語句已經在原來的DataFrame中添加了三列,列名分別為Normalized_Protein和Normalized_Fat,Norm_Nutr_Index。只需要使用中括弧和賦值符就能添加新列,類似於字典 對DataFrame的某一列數據排序,只需要使用函數sort()即可 food_info.sort("Sodium_(mg)") # 函數參數為列名,預設是按照升序排序,同時返回一個新的DataFrame food_info.sort("Norm_Nutr_Index", inplace=True, ascending=False ) # 通過inplace參數來控制在原表排序,而不是返回一個新的對象;ascending參數用來控制是否升序排序