Python--Pandas.1(Series的概念和創建,索引和切片,常用的基本操作)


Pandas

包概述

Pandas是一個Python 的包,提供快速、靈活和富有表現力的數據結構,旨在使"關系或標記數據的使用既簡單又直觀"。
它的目標是成為用Python進行實際的、真實的數據分析的基礎高級模塊。
此外,它還有更宏遠的目標,即成為超過任何語言的最強大,最靈活的開源數據分析/操作工具。它已朝着這個目標邁進。

 

Series的基本概念和創建

   Pandas的數據結構,分兩種: SeriesDataFrame. Series的中文意思是序列,系列.


  我們來學習Series,它的基本概念和創建方式. Series可以認為是一個一維數組
  Series的 導入方式 :
1 import numpy as np
2 import pandas as pd  

  Series對象的創建方式,如下:

tes = pd.Series(np.random.rand(5))
print(tes)
print(tes.values , type(tes.values))

  根據輸出結果可以看到 : Series是一個帶有標簽的一維數組,可以保存任何的數據類型.包括整數,字符串,浮點數,Python對象. 軸標簽就是索引, Index

 

  使用 .index 可以查看索引 ,例如 tes.index 可以看到起止索引及索引長度. 使用.values 屬性可以查看該數組的值. 是Ndarray(數組)
  Series相比較Ndarray, Series多了一個自帶索引功能.就是一個一維數組加上對應的索引.Series更像是一個帶有順序的字典.


   以上是Series的基本概念,下面來了解下Series的幾種創建方式:
  第一種 : 字典創建, 字典的Key值就是index索引, values就是values 數組的值.如下:
dic ={'a':1,'b':2,'c':'a'}
tes = pd.Series(dic)
tes.values

 

 

 

   當元素里的類型不一致時,tes的類型就是一個Object對象.

  第二種,由 數組創建 (一維數組)
arr =np.random.randn(5)
tes = pd.Series(arr)
print(tes)

 

  既然Index是默認使用整數,那么也可以對它進行修改,修改方法是這樣的:

tes = pd.Series(arr,index=list('abcde'),dtype=np.float64)
print(tes)

 

 

 

   這樣就可以對默認索引替換了,可以看到在創建Series時添加了一個index屬性.還可以在創建 Series 時添加 dtype屬性,設置數組的數據類型.例如 dtype=np.float64

   接下來看第三種創建方式: 由 標量創建.如下:
tes = pd.Series(10,index=list('abcde'))
print(tes)

  可以看到,用整數 "10" 對該數組進行填充.那么有個問題,就是 如果用標量來創建,就必須給該數組提供 Index,索引,來匹配數組的長度
  數組有一個名稱屬性, name ,默認為null,我們可以在創建時給數組添加一個name, 還有一個是重命名屬性 rename.

 Series的索引和切片

索引分別為哪些呢?分為 : 位置下標,標簽索引,切片索引和布爾型索引

那什么是位置下標呢?如示例
tes =pd.Series(np.random.rand(5),index=list('abcde'))
print(tes[0])

 

 

 可以看到,和序列差不多,嘗試使用tes[-1],卻報錯了,說明行不通(jupyter),易混淆,不能使用負數取值.Pycharm卻可以....  

 

 

 

標簽索引的使用:取單個值和多個值
print(tes['a'],tes[['a','b']],tes['a'].dtype)  #運行時 tes['a'] 已去除

 

 

 

根據結果可以看出,索引的方式和字典差不多,相當於字典,選擇多個返回的則是一個Series對象
那么上面的位置下標是否也可以選取多個值.試一下看看
print(tes[[1,4]])  #注意:索引標簽index前面已設置

 

 

 

所以不能使用負數,它和列表的取值是有區別的,接下來看切片的使用:
s1 = pd.Series(np.random.rand(5))
s2 = pd.Series(np.random.rand(5),index=list('abcde'))
print(s1[1:4])
print(s2['a':'c'])

 

 

 

可以看到標簽索引包頭尾,所以:標簽索引切片是一個閉區間,是字符串索引,包含頭和尾
切片的寫法和list基本一致, 同樣可以這樣切片 s2[::2] 從第一個開始隔2取1個值..

布爾型索引,先定義示例數據 : 
s = pd.Series(np.arange(10))
s[4]=None   #將其中一個值設置為空值
# 對s數組做一個判斷,並得到結果
bs1 = s>5
print(bs1)

 

 

 

可以看到 返回的是一個布爾類型的數組
再設置2個判斷 用isnull()和notnull(),得到bs2 和 bs3.
bs2 = s.isnull()
bs3 = s.notnull()
數組做了判斷之后返回的一個由布爾值組成的新數組,Series,序列.bs2和bbs3是判斷返回的布爾型新數組.
s[bs1]  # 就拿到了所有為True的值,也就是拿到了所有>5的值
s[bs2]  # 拿到了所有為None的值
s[bs3]  # 拿到了所有不為None的值
# 輸出結果就不一一展示了.這就是布爾型索引 #

 Series的基本操作

首先是 數據查看

比如我想看前面5個數據, 可以使用 head(),那么可以這樣
arr = pd.Series(np.random.rand(50))
print(arr.head())   # head方法默認顯示前面5個

既然有查看前面個數的,那也查看尾數幾個的, .tail()方法

arr.tail(10)   #默認顯示最后5個,可以在括號里添加顯示個數

 

 

 

 


 

重新索引 (reindex)  ,也就是對索引進行更改,如何做呢,往下看

 
        
tes = pd.Series(np.random.rand(5),index=list('abcde'))
s = tes.reindex(['c','d','a','d','ab'])  #會根據你的索引,重新排序
print(s)  
 
        

 

 

如果給個不存在的,如果索引不存在,就引入缺失值NaN,如上代碼,已添加不存在索引
 
缺失值不好,因為數組要進行計算,任何與NaN計算都會為NaN. Series有個 fill_value參數  可以設置缺失值
 
        
tes.reindex(['c','d','a','d','ab'],fill_value=0)
 
        

 

 

 

reindex 會返回一個新的Series,不修改原數據,另外索引還可以重復.這個是很有用的,如多拷貝一行,重新索引就可以做到.


下一個知識 :  對齊

 

s1 = pd.Series(np.random.rand(3),index = ['Jack','Mary','Tom'])
s2 = pd.Series(np.random.rand(3),index = ['Wang','Jack','Marry'])
print(s1)
print(s2)
print(s1+s2)

 

 

 

  index是自動對齊,順序不受影響,沒找到默認為None,None和任何值計算都為None.所以Tom+None 和Wang+None 都為None.


再一個   刪除 功能 :

tes = pd.Series(np.random.rand(5),index=list('abcde'))

如果我們要刪除'c', 該怎么做?

tes.drop('c')

 

 

drop 返回一個刪除了指定數據的新的 Series .
drop 里有個inplace參數  默認為False , drop刪除之后會返回新的Series,將inplace設置為True,不會返回新的序列,會修改原數據 將指定數據刪除.
drop 還可以刪除多個,可以通過一個list刪除, 如: tes.drop(['a','b'])

 


添加  元素 : 

可以直接添加

tes['f'] = 100

 

 

能不能添加多個?

tes[['f','e']]=100  

Traceback (most recent call last) :
File" C:/Users/Administrator/ PycharmPro jects/Python test/pandas 2 2. py”,line 8,in <module>
tes[['f' ,'e' ]]=100
File "C: \Users \Administrator PycharmProjects\Python test \venv\lib\site-packages \pandas\core\series. py",line 1244, in_ _setitem_
setitem(key,value)
File "C:\Users\Administrator PycharmPro jects\Python test \venv\lib\site-packages \pandas\core\series. py”,line 1240, in setitem 
self._ set_ with (key, value)
File "C: \Users\Administrator \PycharmPro jects\Python test \venv\lib\site-packages \pandas\core\series.py", line 1301, in_ _set_ with
self._ set_ labels(key, value)
File "C:\Users\Administrator PycharmPro jects\Python test \venv\lib\site-packages \pandas\core\series. py”,line 1311, in_ set_ 1abels
raise ValueError("%s not contained in the index” % str (key [mask]))
ValueError: [’ f'] not contained in the index

#出現報錯,所以這樣行不通#


還能通過索引添加 :

arr = pd.Series(np.random.rand(5))
arr[5]=200

 

 

那么還有一個添加方法  append()  直接添加一個數組

tes.append(arr)  

 

 

.append 方法會返回一個新的序列Series, 不改變原數據


修改 修改很簡單,直接通過賦值的方式 :

arr = pd.Series(np.random.rand(5),index=list('abcde'))
arr['a']=100

 

 

直接通過索引賦值,類似於列表.


 以上就是Series的一些基本操作......



 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

#------------------#


免責聲明!

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



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