從今天開始連載數據分析利器 pandas 的系列文章,推薦 Pycharm 集成 Python3.6+;無論你是零基礎小白,還是已經上手過 pandas,你都可以在本次系列中學到一些乾貨。
摘自百度百科:pandas 是基於 numpy 的一種工具,該工具是為了解決數據分析任務而創建的。pandas 納入了大量庫和一些標準的數據模型,提供了高效地操作大型數據集所需的工具。pandas 提供了大量能使我們快速便捷地處理數據的函數和方法。你很快就會發現,它是使 Python 成為強大而高效的數據分析環境的重要因素之一。
雖然 pandas 基於 numpy,但是在開始 pandas 系列文章前,我並不打算先介紹 numpy 的具體使用,因為 numpy 著重解決的是多維列表或矩陣的數學運算問題,pandas 設計之初就是為了解決實際問題,我認為可以直接上手 pandas,在系列教程中,我會儘量預設讀者朋友們沒有 numpy 基礎,或者說,需要 numpy 知識的地方,我會直接帶著說出,我會儘量以 最簡潔的文字最少的預備知識,講完整個 pandas 系列。
作為系列的開篇,本文的中心任務是讓每一個讀者都熟悉 pandas 中的一種數據結構的概念和基本操作,它就是 Series 。
Series 是一種類似於 一維 數組的對象,由一組數據(數據類型可以是整數、浮點數、字符串和其他 Python 對象)和與之同長度的索引(或稱標籤)組成。舉個例子:
import pandas as pd
# 標籤 1 索引 數據'a', 標籤 2 索引數據 'b'...
s = pd.Series(data=['a','b','c','d'],index=[1,2,3,4])
print(s)
對於構造函數 pd.Series(),我們最常關心的三個參數是 數據 data、索引 index 和 數據類型dtype,分別可以通過 Series 的 values、index 和 dtype 屬性訪問。
# 代碼接上一段,後同
print(s.values)
print(s.index)
print(s.dtype)
data 是必選參數,index 如預設,其默認是 range(len(data)),如上面的代碼沒有指定 index,則 index = [0,1,2,3],而不是[1,2,3,4];dtype 如預設,默認為 object;
通過數組(列表)創建data = ['l','o','v','e']
s1 = pd.Series(data=data)
print(s1)
data = {'math':100,'english':94,'chinese':'95'}
s2 = pd.Series(data=data)
print(s2)
可以看到,字典的 鍵 作為索引,值 作為數據,創建了 Series
通過常量創建通過這種方式創建,必須指定 index,他們都索引到同一個值,這個值就是我們給出的常量。
s3 = pd.Series(1,index=[1,2,3,4,5])
print(s3)
以 Series s2 為例:
切片Series 類似於列表,也提供了切片操作:
print(s2[1:3])
對於切片,要注意兩點:一是下標是從 0 開始的,二是前閉後開區間,[1:3] 只包括下標 1、2,也就是 Series 的第二、第三個數據,注意切片的下標和 Series 的 index 沒有關係。
index 索引這種方式類似於字典的按鍵取值
print('math',s2['math'])
上面的代碼將會列印出 100,也可以 s2.get('math') 取到 100,如果不確定 math 是否存在於 s2 中,可以通過 s2.get('math',101) 設置預設值 101,如果不存在,則會返回 101 而不會報錯。
head()/tail()見名知意,head() 是取前幾個數據,tail() 是取後幾個數據。
print(s2.head())
print(s2.head(2))
默認是取 5 個,如果不足 5 個則取全部。
條件查詢print("\n成績大於 95 的科目:\n",s2[s2>95])
print("\n成績等於 95 的科目:\n",s2[s2==95])
print("\n成績大於等於 95 的科目:\n",s2[s2>=95])
有兩個函數:append() 和 set_value() 可以完成該功能,不過 append() 只接受 Series/DataFrame 形式參數,是通過新建了一個 Series 完成了修改,必須接受它的返回值;set_value() 比較像 Python 內置的字典新增 item 的方式,是原地修改。
s2 = s2.append(pd.Series({'music':98}))
print(s2)
s2.set_value('history',99)
print(s2)
注意上面的警告,set_value() 會在未來的版本中廢棄,推薦用 .at[] 或者 .iat[] 表達式。
s2.at['history'] = 93
s2.at['geo'] = 91
print(s2)
通過實驗發現 .at[] 和前面的 index 索引查詢效果幾乎相同,都可查詢,可修改,可新增;所以 .get()/[] 不僅是查詢方式,還可以修改新增;.at[] 也可作為查詢方式之一,用法靈活。
.iat[] 和 .at[] 僅一個 i 的區別,功能相同,這個 i 代表整數的英文 Integer,代表 .iat[] 僅可通過下標訪問數據,如修改 math 的成績為 99:
s2.iat[0] = 99
print(s2)
使用 drop() 函數即可,注意它不默認是原地修改,需要接收返回值:
s2 = s2.drop('math')
print(s2)
可以通過設置參數 inplace=True 而變成原地修改,下面的代碼和上面的代碼效果完全相同:
s2.drop('math',inplace=True)
print(s2)
如果僅僅是想獲得 data 中的不重複數據,直接用 unique() , 它返回一個列表,Series 本身並沒有變化;
如果想去掉 Series 裡的重複數據,推薦用 drop_duplicates(),它也有 inplace 參數,另一個重要的參數是 keep,常取值 first/last,即在重複數據中,保留第一個/最後一個。
s2['english'] = 95
print(s2.unique(),'\n')
print(s2,'\n')
s2.drop_duplicates(keep='last',inplace=True)
print(s2)
通過 sort_values() 完成排序,主要關注參數 inplace 和 ascending(是否按升序排序,默認為 True,即默認升序排列:
s2.sort_values(inplace=True,ascending=True)
print(s2)
函數對 isnull()/notnull() 是一對反義函數,見名知意,缺失值檢測,返回和 data 同長度的 bool 列表:
s2['bio'] = None
print(s2.isnull(),'\n')
print(s2.notnull())
Series 到此為止,作為 pandas 兩種數據結構之一,它是另一種數據結構 DataFrame 的基礎,只不過 Series 是一維的,DataFrame 是二維表格式的,下一篇就談 DataFrame,在此之前請先消化好 Series。