Pandas簡易入門(一)

目錄: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變量

 

該文件的內容以下:排序

圖片3

 

使用函數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會把文件的一行做爲列的索引標籤,使用行數字做爲行的索引標籤

圖片4

注意,行標籤是從數字0開始的

Pandas使用Series數據結構來表示一行或一列的數據,相似於Numpy使用向量來表示數據。Numpy只能使用數字來索引,而Series可使用非數字來索引數據,當你選擇返回一行數據的時候,Series並不單單返回該行的數據,同時還有每一列的標籤的名字。

譬如要返回文件的第一行數據,Numpy就會返回一個列表(但你可能不知道每個數字究竟表明了什麼)

圖片5

而Pandas則會同時把每一列的標籤名返回(此時就很清楚數據的意思了)

圖片6

 

選擇數據

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"]

原理:

圖片7

因爲每一列的數據跨度太大,有的數據是從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參數用來控制是否升序排序
相關文章
相關標籤/搜索