Python資料分析-Day2-Pandas模組

來源:互聯網
上載者:User

標籤:封裝   解決   泰坦尼克   資料格式   定位   基本操作   nes   自訂函數   使用   

1、pandas簡介

Python Data Analysis Library 或 pandas 是基於NumPy 的一種工具,該工具是為瞭解決資料分析任務而建立的。Pandas 納入了大量庫和一些標準的資料模型,提供了高效地操作大型資料集所需的工具。pandas提供了大量能使我們快速便捷地處理資料的函數和方法。你很快就會發現,它是使Python成為強大而高效的資料分析環境的重要因素之一。

pandas是numpy庫的更進階封裝,pandas方法中很多是調用了numpy庫的方法

 

2、pandas基本操作1)檔案讀取

import pandas

food_info=pandas.read_csv("food_info.csv")

print(type(food_info))

print(food_info.dtypes)

print(help(pandas.read_csv))

 

output:

<class ‘pandas.core.frame.DataFrame‘>  # DataFrame就是pandas的核心資料結構,類似矩陣結構;numpy的核心資料結構是ndarray,詳情見上一章

--------------
NDB_No int64
Shrt_Desc object  #pandas對字元型資料類型定義較為怪異,稱之為 object類型,object=str
Water_(g) float64
Energ_Kcal int64
Protein_(g) float64
Lipid_Tot_(g) float64
Ash_(g) float64
Carbohydrt_(g) float64
Fiber_TD_(g) float64
Sugar_Tot_(g) float64
Calcium_(mg) float64
Iron_(mg) float64
Magnesium_(mg) float64
Phosphorus_(mg) float64
Potassium_(mg) float64
Sodium_(mg) float64
Zinc_(mg) float64
Copper_(mg) float64
Manganese_(mg) float64
Selenium_(mcg) float64
Vit_C_(mg) float64
Thiamin_(mg) float64
Riboflavin_(mg) float64
Niacin_(mg) float64
Vit_B6_(mg) float64
Vit_B12_(mcg) float64
Vit_A_IU float64
Vit_A_RAE float64
Vit_E_(mg) float64
Vit_D_mcg float64
Vit_D_IU float64
Vit_K_(mcg) float64
FA_Sat_(g) float64
FA_Mono_(g) float64
FA_Poly_(g) float64
Cholestrl_(mg) float64
dtype: object
--------------

2)顯示dataframe資料前幾行:

first_rows = food_info.head()  #pandas的資料格式下調用head方法,是讀取該資料格式的資料包括表頭,如果不寫參數,預設讀取前5行資料。
print first_rows
#print(food_info.head(3))

3)顯示dataframe資料尾幾行:

last_rows = food_info.tail()  #pandas的資料格式下調用tail方法,是讀取該資料格式的資料包括表頭,如果不寫參數,預設讀取後5行資料。
print last_rows

4)dataframe列名

print food_info.columns  #列印dataframe資料類型下的各列列名。

5)dataframe樣本數和指標數

print food_info.shape  #列印dataframe形狀,幾行幾列,其中行數就是樣本數,列數就是指標數。

6)pandas取資料 按樣本(行)取資料:

pandas資料讀取相對麻煩,不像python或numpy那樣簡單。pandas需要調用一個函數,才能對相關資料進行讀取。

這個方法就是loc[]方法,如下

print food_info.loc[0]#dataframe資料有一個特徵,就是樣本數和指標數的分離。無論什麼資料在dataframe裡指標數固定,這裡的索引index=0,是對樣本進行索引。

 

output:  #所以這裡取出的是樣本1所對應的所有屬性或指標。

NDB_No 1001
Shrt_Desc BUTTER WITH SALT
Water_(g) 15.87
Energ_Kcal 717
Protein_(g) 0.85
Lipid_Tot_(g) 81.11
Ash_(g) 2.11
Carbohydrt_(g) 0.06
Fiber_TD_(g) 0
Sugar_Tot_(g) 0.06
Calcium_(mg) 24
Iron_(mg) 0.02
Magnesium_(mg) 2
Phosphorus_(mg) 24
Potassium_(mg) 24
Sodium_(mg) 643
Zinc_(mg) 0.09
Copper_(mg) 0
Manganese_(mg) 0
Selenium_(mcg) 1
Vit_C_(mg) 0
Thiamin_(mg) 0.005
Riboflavin_(mg) 0.034
Niacin_(mg) 0.042
Vit_B6_(mg) 0.003
Vit_B12_(mcg) 0.17
Vit_A_IU 2499
Vit_A_RAE 684
Vit_E_(mg) 2.32
Vit_D_mcg 1.5
Vit_D_IU 60
Vit_K_(mcg) 7
FA_Sat_(g) 51.368
FA_Mono_(g) 21.021
FA_Poly_(g) 3.043
Cholestrl_(mg) 215
Name: 0, dtype: object

 

同樣dataframe.loc[3:6]可以對pandas的資料進行切片,方法與python類似。

想取任意資料的話,只需要把其對應的索引值傳入就可以了。

 

按指標(列)取資料:

ndb_col = food_info["NDB_No"]  #在dataframe格式下,把列名作為索引傳遞給資料對象,就可以得到這一列的所有資料。
print ndb_col

如果想列印多列:

columns = ["Zinc_(mg)", "Copper_(mg)"]  #先把想列印的列名組合成一個list格式
zinc_copper = food_info[columns]    #然後一起傳遞給dataframe的資料對象,就可以多列列印了。
print zinc_copper

 

需求:在這些資料中,找出以‘g’為結尾的列名和整列資料

col_names = food_info.columns.tolist()  # columns方法是提取列名,tolist方法是把列名轉化成list格式
gram_columns = []

for c in col_names:  #遍曆可迭代對象col_names
  if c.endswith("(g)"):  
    gram_columns.append(c)
gram_df = food_info[gram_columns]  #把以“g”結尾的列名為索引代入dataframe對象,得出對應的多列資料。
print(gram_df.head(3))

7)pandas中的資料類型
#object - For string values
#int - For integer values
#float - For float values
#datetime - For time values
#bool - For Boolean values
#print(food_info.dtypes)

 

3、pandas加減乘除的操作

對整列的資料的操作,等價於對該列中每個元素進行對應的操作,與numpy類似。

print food_info["Iron_(mg)"]
div_1000 = food_info["Iron_(mg)"] / 1000
print div_1000

對兩個列進行組合:

water_energy = food_info["Water_(g)"] * food_info["Energ_Kcal"]
這個兩列相乘,是把兩列中同一樣本的不同資料對應相乘,把結果儲存成一個新的列

 

添加新屬性,即添加新列:

iron_grams = food_info["Iron_(mg)"] / 1000
food_info["Iron_(g)"] = iron_grams

添加有個前提,就是添加的資料樣本數要和原dataframe樣本數一致,即行數一樣,直接用索引+賦值的方式添加即可。

 

求某列的最大值:

max_calories = food_info["Energ_Kcal"].max()

首先定位好要求最大值的列,然後直接調用max方法,即可求出某列的最大值。

 

4、pandas的排序操作

food_info.sort_values("Sodium_(mg)", inplace=True)
print food_info["Sodium_(mg)"]

對dataframe資料結構調用sort_values方法即可排序,預設是從小到大排序。第一個參數是要對哪一個列進行排序,inplace是判斷是新產生dataframe還是覆蓋舊的。

food_info.sort_values("Sodium_(mg)", inplace=True, ascending=False)
print food_info["Sodium_(mg)"]

需要降序排列時,要指定sort_values的參數ascending=False,ascending的意思是升序。這個值預設是True,給它改成False就是降序排列了。

 

5、泰坦尼克號pandas處理執行個體

1)資料匯入

import pandas as pd  
import numpy as np    #一般我們用np代替numpy,用pd代替pandas
titanic_survival = pd.read_csv("titanic_train.csv")  #讀入csv檔案  
titanic_survival.head()  #顯示頭幾個資料

2)資料操作

age = titanic_survival["Age"]  #選中Age這一列,並把它單獨儲存
#print(age.loc[0:10])  #age這時候已經只有一列,就是剛剛選出來的,這時候調用loc函數,輸入切片位置,就可以僅僅取出age中對應位置的資料了
age_is_null = pd.isnull(age)  #isnull方法是判斷該資料中資料位元是不是為空白,如果為空白返回True,括弧裡傳入需要判斷的資料群組
#print age_is_null  
age_null_true = age[age_is_null]  #把bool值作為索引傳入,得到資料為空白的那些資料
#print age_null_true
age_null_count = len(age_null_true)  #判斷資料為空白的個數
print(age_null_count)

3)null值的影響

mean_age = sum(titanic_survival["Age"]) / len(titanic_survival["Age"])  #先對age這一列求和,然後除以age這一列的個數
print mean_age

output:

  Nan

這種情況就是因為sum中有null空值,所以結果就會報錯。

4)null值的處理

good_ages = titanic_survival["Age"][age_is_null == False]  #age_is_null==False是取出不是缺失值的資料
#print good_ages
correct_mean_age = sum(good_ages) / len(good_ages)
print correct_mean_age

 當然求均值可以直接調用mean方法,如下

correct_mean_age = titanic_survival["Age"].mean()
print correct_mean_age  #這段代碼的輸出結果與上一段代碼的結果完全一樣。

5)資料統計

需求:求出每個不同等級的船艙的平均船票

#mean fare for each class
passenger_classes = [1, 2, 3]  #先設定船艙等級列表
fares_by_class = {}  #建立一個空字典,準備存放不同船艙的平均船票資料
for this_class in passenger_classes:  #遍曆不同等級的船艙
pclass_rows = titanic_survival[titanic_survival["Pclass"] == this_class]  #先取出船艙列,對比目前遍曆等級取出對應等級船艙資料
pclass_fares = pclass_rows["Fare"]  #在這類資料中,取出價格列
fare_for_class = pclass_fares.mean()  #求該價格列的平均值
fares_by_class[this_class] = fare_for_class  #以船艙等級為key值,平均fare為value值,存入字典中
print fares_by_class  #列印字典

 

pd內建的統計函數:pivot_table

passenger_survival = titanic_survival.pivot_table(index="Pclass", values="Survived", aggfunc=np.mean)

#index是以誰為基準統計,values是基準和誰之間的關係, aggfunc是要統計前兩個參數之間的什麼關係。
print passenger_survival

統計不同等級船艙的乘客的平均年齡:

passenger_age = titanic_survival.pivot_table(index="Pclass", values="Age")#以pclass為基準統計,統計的值是age的平均值。aggfunc預設值為np.mean
print(passenger_age)

統計一個變數和其他兩個量之間的關係:

port_stats = titanic_survival.pivot_table(index="Embarked", values=["Fare","Survived"], aggfunc=np.sum)
print(port_stats)

#以embarked為基準,統計它和fare與survived的關係,統計的關係為求和。即在不同碼頭登船的人的總費用和總的獲救數量。

6)丟掉null值:dropna

drop_na_columns = titanic_survival.dropna(axis=1)  #橫向丟掉缺失資料的樣本
new_titanic_survival = titanic_survival.dropna(axis=0,subset=["Age", "Sex"])  #縱向去掉,age和sex這兩列中如果有缺失值,去掉該樣本。
#print new_titanic_survival

7)通過索引調取資料

row_index_83_age = titanic_survival.loc[83,"Age"]  #通過索引調取資料,都需要使用loc函數,位置1輸入樣本序號,位置2輸入對應的屬性
row_index_1000_pclass = titanic_survival.loc[1000,"Pclass"]
print row_index_83_age
print row_index_1000_pclass

8)排序後重新設定索引

new_titanic_survival = titanic_survival.sort_values("Age",ascending=False)  #以age為依據降序排列
print new_titanic_survival[0:10]  #取新資料的前11個樣本,即年齡最大的前11個樣本
itanic_reindexed = new_titanic_survival.reset_index(drop=True)  #對新的dataframe資料,調用reset_index重新設定索引,drop為true意思是刪除原有index。
print(titanic_reindexed.iloc[0:10])

 

6、pd自訂函數

1)例子1:

def hundredth_row(column):  #首先定義一個函數
  hundredth_item = column.loc[99]  #函數內調用loc方法,使得程式返回第100個樣本資料
  return hundredth_item  #用return把資料返還給調用該函數的位置 

hundredth_row = titanic_survival.apply(hundredth_row)  #對dataframe資料調用apply方法裡面傳入之前定義的函數,即執行自訂函數的操作。
print hundredth_row

2)例子2:

def not_null_count(column):  #定義一個函數,形參必須為column,名字可以任取,預設column處會以遍曆的方式把每一列的列名都代入。
  column_null = pd.isnull(column)  #調用pd的isnull方法,遍曆的判斷每列中的所有資料是否是缺失狀態
  null = column[column_null]  #把每列中缺失的樣本賦值給null
  return len(null)    #遍曆的方式返回每列中缺失值的數量

column_null_count = titanic_survival.apply(not_null_count)  #對dataframe資料執行apply方法,直接調用自訂函數
print column_null_count

3)例子3:

def which_class(row):
  pclass = row[‘Pclass‘]
  if pd.isnull(pclass):
    return "Unknown"
  elif pclass == 1:
    return "First Class"
  elif pclass == 2:
    return "Second Class"
  elif pclass == 3:
    return "Third Class"

classes = titanic_survival.apply(which_class, axis=1)
print classes

4)例子4:

def generate_age_label(row):  #定義一個函數,形參為row
  age = row["Age"]  #
  if pd.isnull(age):
    return "unknown"
  elif age < 18:
    return "minor"
  else:
    return "adult"

age_labels = titanic_survival.apply(generate_age_label, axis=1)
print age_labels

 

Python資料分析-Day2-Pandas模組

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.