Pandas簡易入門(三)


本節主要介紹一下Pandas的數據結構,本文引用的網址:https://www.dataquest.io/mission/146/pandas-internals-series

本文所使用的數據來自於:https://github.com/fivethirtyeight/data/tree/master/fandango

該數據主要描述了一些電影的爛番茄評分情況

 

數據結構

在Pandas中,主要有三種重要的數據結構:

  • Series(值的集合)
  • DataFrame(Series的集合)
  • Panel(DataFrame的集合)

 

Pandas的Series是Numpy的數組(array)的升級版,Numpy只能使用整數來所索引,但是Series還可以使用字符串來索引,還能使用混合的數據類型和NaN來表示缺失值,一個Series對象可以包含以下幾種數據類型:

  • float -- 表示字符串數值
  • int -- 表示整型數值
  • bool -- 表示布爾值
  • datetime64[ns] -- 表示日期和時間(不帶時區)
  • datetime64[ns, tz] -- 表示日期和時間(有時區)
  • timedelta[ns] -- 以不同的格式(分鍾,秒等)格式表示時間
  • category -- 表示分類值
  • object -- 表示字符串值

 

DataFrame使用Series對象來表示每一列的數據,所以當從一個DataFrame中選擇某一列的時間,Pandas會返回代表了該列的Series對象,並且從0開始索引該Series的行,當然也可以使用分片來選擇多行

# 分別選擇FILM和RottenTomatoes兩列,並輸出前5行

fandango = pd.read_csv('fandango_score_comparison.csv')

series_film = fandango['FILM']

print(series_film.head(5)) 

series_rt = fandango['RottenTomatoes']

print(series_rt[:5])

輸出:

Image 235

原始的數據如下:

Image 236

 

 

自定義索引

上面提取了兩個Series,series_film代表了電影名稱,series_rt代表了評分,我現在想知道這兩部電影(Minions (2015), Leviathan (2014))的評分,最簡單的方法就是這樣

print(fandango[fandango['FILM']=='Minions (2015)']['RottenTomatoes'].values[0])

print(fandango[fandango['FILM']=='Leviathan (2014)']['RottenTomatoes'].values[0])

# 這樣要對每部電影都寫一個語句是非常麻煩的

# 最好的方法就是將series_film和series_rt組合成一個新的Series,用電影名稱作為索引,電影評分作為值,這樣要查詢多部電影時就變得方便

film_names = series_film.values

rt_scores = series_rt.values

series_custom = Series(rt_scores , index=film_names) # 創建一個Series,需要指定data和index參數

Image 237

 

#此時要查詢多部電影就變得簡單

series_custom[['Minions (2015)', 'Leviathan (2014)']]

#對於上面新建的一個Series,現在要對電影的名稱進行按字母重新排序,可以使用sort_index()函數,如果要對電影的評分排序則使用sort_values()函數

sc2 = series_custom.sort_index()

sc3 = series_custom.sort_values()

Image 238

Image 239

 

向量化運算

當你要操作數據集中的某一列的數據時,Series對象可以快速地進行向量化的運算(自動對該列中的每個數據值都進行運算),Pandas的底層使用了Numpy,而Numpy則使用了C語言來循環一整列的值,所以會快得飛起。要是你特意使用一個for來循環一個Series對象,實際上會變得非常慢。

 

向量化運算的例子

#對一個Series進行加減乘除運算

series_custom/10

# 這個語句實際上是對series_custom這個Series中的每個值都進行除法運算,注意,是不會對索引進行運算的

# 也可以使用Numpy的函數來進行運算

np.max(series_custom) #求出電影分數的最大值

還可以進行比較與過濾

series_custom > 50 # 返回一個包含布爾值的列表,分數大於50則返回True,可以用於過濾數據

series_greater_than_50 = series_custom[series_custom > 50]

# 也可以使用&(and)和 |(or)連接幾個判斷

series_greater_than_50_&_less_than_80 = \

    series_custom[(series_custom > 50)  & (series_custom < 80) ]

當然,也可以直接對兩個Series進行運算

rt_critics = Series(fandango['RottenTomatoes'].values, index=fandango['FILM']) # 影評人的評分

rt_users = Series(fandango['RottenTomatoes_User'].values, index=fandango['FILM']) #用戶評分

rt_mean = (rt_critics + rt_users) / 2 # 平均分

Image 240


免責聲明!

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



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