做算法工作的都知道,沒有數據怎麼玩? 軟件工程,機器學習,深度學習,算法工程師,清洗、分析數據Pandas那是一利器,熟練準確地使用Pandas,會使你應對工作更輕鬆自如,讓你少熬夜加班。本文根據近期工作使用Pandas的心得體會,總結下Pandas的框架結構和常用的API,書寫思路按照使用Pandas的邏輯結構,分享給大家。
1
Series對象介紹
Series 是pandas兩大數據結構中(DataFrame,Series)的一種,我們先從Series的定義說起,Series是一種類似於一維數組的對象,它由一組數據(各種NumPy數據類型)以及一組與之相關的數據標籤(即索引)組成。
Series對象本質上是一個NumPy的數組,因此NumPy的數組處理函數可以直接對Series進行處理。但是Series除了可以使用位置作為下標存取元素之外,還可以使用標籤下標存取元素,這一點和字典相似,每個Series對象都由兩個數組組成:
1) index: 它是從NumPy數組繼承的Index對象,保存標籤信息。
2) values: 保存值的NumPy數組。
瞭解Series的這種數據結構,對於接下來使用Series至關重要。
2
靈活使用Series
這部分的總結思路如下:
- 如何創建Series;
- Series索引;
- Series的增刪改查
2.1 創建Series
創建Series,直接調用Series的構造函數,如下:
#只指定values
s1 = pd.Series( [3,5,7])
#還指定index
s2 = pd.Series( [3,5,7], index = list('ABC') )
#再指定name
s3 = pd.Series( [3,5,7], index = list('ABC'),name='s3' ) #指定name的作用:append到pd中的行索引標籤
- 單獨說明一點:
- Series的元素類型可以是不同的,比如:
mix = pd.Series( [3, '5', 7.0] ) # 此時的mix的類型為object,而不是像上面的int64
2.2 Series索引
創建Series時,如果不指定index,默認索引從0開始。如果創建完Series後,想修改索引,可以這樣:
s1.index = ['a', 'b', 'c']
這樣,s1的索引變為從'a'開始。
2.3 Series增刪改查
2.3.1增加
Series的增加有兩個類似的API,但是不要混淆了啊,一個是add,它的效果是元素對應相加,另一個是append,才是將元素拼接到原series後。
s3.add(s2)
元素的個數還是3個,只不過元素大小變為[6,10,14],注意如果索引不相同的add,會增加元素個數,但是所有元素都變為Nan
那append的呢?
s3.append(s2) #元素個數變為6個,並且索引可以允許重複,記住pandas中是允許出現重複的索引標籤的。
2.3.2 刪除
如何刪除series的一個元素呢,調用drop,接口中傳入一個索引標籤。
s3.drop('A')
刪除後如果再想恢復怎麼辦呢?因為series的index是一個list,所以先添加一個pd.Index()實例,然後再充填上值就行:
s3.index.append(pd.Index(['A']) )
2.3.3 修改
想修改某個元素,直接找到對應的標籤(按照字典的方式),或找到對應的values的索引,
s3['B'] = 6
或者,
s3[1] = 6
2.3.4 查找
查找某個元素,可以通過標籤或索引,見如上的修改方法,不再詳述。
3
DataFrame
DataFrame是pandas的兩個重要數據結構的另一個,可以看做是Series的容器,看早一個DataFrame實例的方法也很簡單:
pd_data = pd.DataFrame([ [9,0,1],[7,3,10] ] )
這種方法默認下行索引標籤和列索引標籤都是從0開始。注意這是DataFrame的重要特性之一,同時具有行列標籤,如果Series是一維的數組,那麼作為其容器的DataFrame自然是二維的數組,其中行的axis=0, 列的axis=1.
既然DataFrame和Series如此緊密,那麼它們之間又是如何通信的呢? 下面看下如何將一個Series轉載到一個DataFrame的實例中。
3.1 裝載Series
先看一個沒達到預期的裝載,我們想把s3裝載到pd_data中,調用append,API調對了,但是錯誤的是它們的索引不對應,所以:
pd_data.append(s3)
因此,以上的DataFrame實例pd_data,修改其columns與s3對應,
pd_data.columns = list('ABC')
pd_data.append(s3)
插播:
- 上面也涉及到DataFrame的行列標籤屬性設置,分別為index, columns,可以先創建後設置標籤,如上所示。
- 可以觀察到s3的name變為了加入後的行標籤
以上,pandas的兩種最重要的數據結構,弄明白了其原理,用起來便能順手些,如有疏漏或錯誤,請指針。
閱讀更多 Python與算法社區 的文章