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變量

 

該文件的內容如下:

圖片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參數用來控制是否升序排序


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM