目錄:python
讀取數據數據結構
索引函數
選擇數據spa
簡單運算code
聲明,本文引用於:https://www.dataquest.io/mission/8/introduction-to-pandas (建議閱讀原文)orm
Pandas使用一個二維的數據結構DataFrame來表示表格式的數據,相比較於Numpy,Pandas能夠存儲混合的數據結構,同時使用NaN來表示缺失的數據,而不用像Numpy同樣要手工處理缺失的數據,而且Pandas使用軸標籤來表示行和列對象
Pandas使用函數read_csv()來讀取csv文件blog
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:
當讀取了一個文件以後,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參數用來控制是否升序排序