目錄
Series
#DataFrame
物件屬性
重新索引
刪除指定軸上的項目
索引和切片
算术运算和数据对齐
函数应用和映射
排序和排名
统计方法
計算百分數變化

pandas 基礎

Jun 23, 2017 pm 03:54 PM
pandas 基礎

pandas 是基於 Numpy 建構的含有更高級資料結構和工具的資料分析套件

類似 Numpy 的核心是 ndarray,pandas 也是圍繞著 Series 和 DataFrame 兩個核心資料結構展開的 。 Series 和 DataFrame 分別對應於一維的序列和二維的表結構。 pandas 約定俗成的導入方法如下:

from pandas import Series,DataFrame
import pandas as pd
登入後複製

 

Series


Series 可以看做一個定長的有序字典。基本上任意的一維資料都可以用來建構Series 物件:

>>> s = Series([1,2,3.0,'abc'])
>>> s
0      1
1      2
2      3
3    abc
dtype: object
登入後複製

雖然 dtype:object 可以包含多種基本資料類型,但總感覺會影響效能的樣子,最好還是保持單純的dtype。

Series 物件包含兩個主要的屬性:index 和 values,分別為上例中左右兩列。因為傳給建構器的是一個列表,所以index 的值是從0 起遞增的整數,如果傳入的是一個類別字典的鍵值對結構,就會產生index-value 對應的Series;或是在初始化的時候以關鍵字參數明確指定一個index 物件:

>>> s = Series(data=[1,3,5,7],index = ['a','b','x','y'])
>>> s
a    1
b    3
x    5
y    7
dtype: int64
>>> s.index
Index(['a', 'b', 'x', 'y'], dtype='object')
>>> s.values
array([1, 3, 5, 7], dtype=int64)
登入後複製

Series 物件的元素會嚴格按照給定的index 構建,這表示:如果data 參數是有鍵值對的,那麼只有index 中包含的鍵會被使用;以及如果data 中缺少回應的鍵,即使給出NaN 值,這個鍵也會被加入。

注意 Series 的 index 和 values 的元素之間雖然存在對應關係,但這與字典的映射不同。 index 和 values 實際上仍為互相獨立的 ndarray 數組,因此 Series 物件的效能完全 ok。

Series 這種使用鍵值對的資料結構最大的好處在於,Series 間進行算術運算時,index 會自動對齊。

此外,Series 物件和它的index 都含有一個 name 屬性:

>>> s.name = 'a_series'
>>> s.index.name = 'the_index'
>>> s
the_index
a            1
b            3
x            5
y            7
Name: a_series, dtype: int64
登入後複製

 

#DataFrame


#DataFrame是一個表格型的資料結構,它含有一組有序的欄位(類似index),每列可以是不同的值類型(不像ndarray 只能有一個dtype)。基本上可以把 DataFrame 看成是共享同一個 index 的 Series 的集合。

DataFrame 的建構方法與Series 類似,只不過可以同時接受多條一維資料來源,每一條都會成為單獨的一列:

>>> data = {'state':['Ohino','Ohino','Ohino','Nevada','Nevada'],
        'year':[2000,2001,2002,2001,2002],
        'pop':[1.5,1.7,3.6,2.4,2.9]}
>>> df = DataFrame(data)
>>> df
   pop   state  year
0  1.5   Ohino  2000
1  1.7   Ohino  2001
2  3.6   Ohino  2002
3  2.4  Nevada  2001
4  2.9  Nevada  2002

[5 rows x 3 columns]
登入後複製

雖然參數data 看起來是個字典,但字典的鍵並非扮演DataFrame 的index 的角色,而是Series 的「name」 屬性。這裡生成的 index 仍是 “01234”。

較完整的DataFrame 建構子參數為:DataFrame(data=None,index=None,coloumns=None),columns 即「name」:

>>> df = DataFrame(data,index=['one','two','three','four','five'],
               columns=['year','state','pop','debt'])
>>> df
       year   state  pop debt
one    2000   Ohino  1.5  NaN
two    2001   Ohino  1.7  NaN
three  2002   Ohino  3.6  NaN
four   2001  Nevada  2.4  NaN
five   2002  Nevada  2.9  NaN

[5 rows x 4 columns]
登入後複製

同樣缺失值由NaN 補上。看一下 index、columns 和 索引的類型:

>>> df.index
Index(['one', 'two', 'three', 'four', 'five'], dtype='object')
>>> df.columns
Index(['year', 'state', 'pop', 'debt'], dtype='object')
>>> type(df['debt'])
<class &#39;pandas.core.series.Series&#39;>
登入後複製

DataFrame 面向行和麵向列的操作基本上是平衡的,任意抽出一列都是 Series。

物件屬性


重新索引

Series 物件的重新索引透過其 .reindex(index=None,**kwargs) 方法實現。 **kwargs 中常用的參數有兩個:method=None,fill_value=np.NaN

ser = Series([4.5,7.2,-5.3,3.6],index=[&#39;d&#39;,&#39;b&#39;,&#39;a&#39;,&#39;c&#39;])
>>> a = [&#39;a&#39;,&#39;b&#39;,&#39;c&#39;,&#39;d&#39;,&#39;e&#39;]
>>> ser.reindex(a)
a   -5.3
b    7.2
c    3.6
d    4.5
e    NaN
dtype: float64
>>> ser.reindex(a,fill_value=0)
a   -5.3
b    7.2
c    3.6
d    4.5
e    0.0
dtype: float64
>>> ser.reindex(a,method=&#39;ffill&#39;)
a   -5.3
b    7.2
c    3.6
d    4.5
e    4.5
dtype: float64
>>> ser.reindex(a,fill_value=0,method=&#39;ffill&#39;)
a   -5.3
b    7.2
c    3.6
d    4.5
e    4.5
dtype: float64
登入後複製

.reindex() 方法會傳回一個新對象,其index 嚴格遵循給出的參數,method:{'backfill', 'bfill', 'pad', 'ffill', None} 參數用於指定內插法(填入)方式,當沒有給出時,自動用 fill_value 填充,預設為NaN(ffill = pad,bfill = back fill,分別指插值時向前或向後取值)

DataFrame 物件的重新索引方法為:.reindex(index=None,columns=None,**kwargs)。僅比 Series 多了一個可選的 columns 參數,用於給列索引。用法與上例類似,只不過插值方法 method 參數只能套用於行,即軸 0。

>>> state = [&#39;Texas&#39;,&#39;Utha&#39;,&#39;California&#39;]
>>> df.reindex(columns=state,method=&#39;ffill&#39;)
    Texas  Utha  California
a      1   NaN           2
c      4   NaN           5  
d      7   NaN           8

[3 rows x 3 columns]
>>> df.reindex(index=[&#39;a&#39;,&#39;b&#39;,&#39;c&#39;,&#39;d&#39;],columns=state,method=&#39;ffill&#39;)
   Texas  Utha  California
a      1   NaN           2
b      1   NaN           2
c      4   NaN           5
d      7   NaN           8

[4 rows x 3 columns]
登入後複製

不過 fill_value 仍對有效。聰明的小夥伴可能已經想到了,可不可以透過 df.T.reindex(index,method='**').T 這樣的方式來實現在列上的插值呢,答案是可行的。另外要注意,使用 reindex(index,method='**') 的時候,index 必須是單調的,否則就會引發一個 ValueError: Must be monotonic for forward fill ,例如上例中的最後一次調用,如果使用 index=['a','b','d','c'] 的話就不行。

刪除指定軸上的項目

即刪除Series 的元素或DataFrame 的某一行(列)的意思,透過物件的 .drop(labels, axis=0) 方法:

>>> ser
d    4.5
b    7.2
a   -5.3
c    3.6
dtype: float64
>>> df
   Ohio  Texas  California
a     0      1           2
c     3      4           5
d     6      7           8

[3 rows x 3 columns]
>>> ser.drop(&#39;c&#39;)
d    4.5
b    7.2
a   -5.3
dtype: float64
>>> df.drop(&#39;a&#39;)
   Ohio  Texas  California
c     3      4           5
d     6      7           8

[2 rows x 3 columns]
>>> df.drop([&#39;Ohio&#39;,&#39;Texas&#39;],axis=1)
   California
a           2
c           5
d           8

[3 rows x 1 columns]
登入後複製

.drop() 回傳的是一個新對象,元物件不會被改變。 

索引和切片

就像 Numpy,pandas 也支援透過 obj[::] 的方式進行索引和切片,以及透過布林型陣列進行篩選。

不過須要注意,因為 pandas 物件的 index 不限於整數,所以當使用非整數作為切片索引時,它是末端包含的。

>>> foo
a    4.5
b    7.2
c   -5.3
d    3.6
dtype: float64
>>> bar
0    4.5
1    7.2
2   -5.3
3    3.6
dtype: float64
>>> foo[:2]
a    4.5
b    7.2
dtype: float64
>>> bar[:2]
0    4.5
1    7.2
dtype: float64
>>> foo[:&#39;c&#39;]
a    4.5
b    7.2
c   -5.3
dtype: float64
登入後複製

这里 foo 和 bar 只有 index 不同——bar 的 index 是整数序列。可见当使用整数索引切片时,结果与 Python 列表或 Numpy 的默认状况相同;换成 &#39;c&#39; 这样的字符串索引时,结果就包含了这个边界元素。

另外一个特别之处在于 DataFrame 对象的索引方式,因为他有两个轴向(双重索引)。

可以这么理解:DataFrame 对象的标准切片语法为:.ix[::,::]。ix 对象可以接受两套切片,分别为行(axis=0)和列(axis=1)的方向:

>>> df
   Ohio  Texas  California
a     0      1           2
c     3      4           5
d     6      7           8

[3 rows x 3 columns]
>>> df.ix[:2,:2]
   Ohio  Texas
a     0      1
c     3      4

[2 rows x 2 columns]
>>> df.ix[&#39;a&#39;,&#39;Ohio&#39;]
0
登入後複製

而不使用 ix ,直接切的情况就特殊了:

  • 索引时,选取的是列

  • 切片时,选取的是行

这看起来有点不合逻辑,但作者解释说 “这种语法设定来源于实践”,我们信他。

>>> df[&#39;Ohio&#39;]
a    0
c    3
d    6
Name: Ohio, dtype: int32
>>> df[:&#39;c&#39;]
   Ohio  Texas  California
a     0      1           2
c     3      4           5

[2 rows x 3 columns]
>>> df[:2]
   Ohio  Texas  California
a     0      1           2
c     3      4           5

[2 rows x 3 columns]
登入後複製

使用布尔型数组的情况,注意行与列的不同切法(列切法的 : 不能省):

>>> df[&#39;Texas&#39;]>=4
a    False
c     True
d     True
Name: Texas, dtype: bool
>>> df[df[&#39;Texas&#39;]>=4]
   Ohio  Texas  California
c     3      4           5
d     6      7           8

[2 rows x 3 columns]
>>> df.ix[:,df.ix[&#39;c&#39;]>=4]
   Texas  California
a      1           2
c      4           5
d      7           8

[3 rows x 2 columns]
登入後複製

算术运算和数据对齐

pandas 最重要的一个功能是,它可以对不同索引的对象进行算术运算。在将对象相加时,结果的索引取索引对的并集。自动的数据对齐在不重叠的索引处引入空值,默认为 NaN。

>>> foo = Series({&#39;a&#39;:1,&#39;b&#39;:2})
>>> foo
a    1
b    2
dtype: int64
>>> bar = Series({&#39;b&#39;:3,&#39;d&#39;:4})
>>> bar
b    3
d    4
dtype: int64
>>> foo + bar
a   NaN
b     5
d   NaN
dtype: float64
登入後複製

DataFrame 的对齐操作会同时发生在行和列上。

当不希望在运算结果中出现 NA 值时,可以使用前面 reindex 中提到过 fill_value 参数,不过为了传递这个参数,就需要使用对象的方法,而不是操作符:df1.add(df2,fill_value=0)。其他算术方法还有:sub(), div(), mul()

Series 和 DataFrame 之间的算术运算涉及广播,暂时先不讲。

函数应用和映射

Numpy 的 ufuncs(元素级数组方法)也可用于操作 pandas 对象。

当希望将函数应用到 DataFrame 对象的某一行或列时,可以使用 .apply(func, axis=0, args=(), **kwds) 方法。

f = lambda x:x.max()-x.min()
>>> df
   Ohio  Texas  California
a     0      1           2
c     3      4           5
d     6      7           8

[3 rows x 3 columns]
>>> df.apply(f)
Ohio          6
Texas         6
California    6
dtype: int64
>>> df.apply(f,axis=1)
a    2
c    2
d    2
dtype: int64
登入後複製

排序和排名

Series 的 sort_index(ascending=True) 方法可以对 index 进行排序操作,ascending 参数用于控制升序或降序,默认为升序。

若要按值对 Series 进行排序,当使用 .order() 方法,任何缺失值默认都会被放到 Series 的末尾。

在 DataFrame 上,.sort_index(axis=0, by=None, ascending=True) 方法多了一个轴向的选择参数与一个 by 参数,by 参数的作用是针对某一(些)列进行排序(不能对行使用 by 参数):

>>> df.sort_index(by=&#39;Ohio&#39;)
   Ohio  Texas  California
a     0      1           2
c     3      4           5
d     6      7           8

[3 rows x 3 columns]
>>> df.sort_index(by=[&#39;California&#39;,&#39;Texas&#39;])
   Ohio  Texas  California
a     0      1           2
c     3      4           5
d     6      7           8

[3 rows x 3 columns]
>>> df.sort_index(axis=1)
   California  Ohio  Texas
a           2     0      1
c           5     3      4
d           8     6      7

[3 rows x 3 columns]
登入後複製

排名(Series.rank(method=&#39;average&#39;, ascending=True))的作用与排序的不同之处在于,他会把对象的 values 替换成名次(从 1 到 n)。这时唯一的问题在于如何处理平级项,方法里的 method 参数就是起这个作用的,他有四个值可选:average, min, max, first

>>> ser=Series([3,2,0,3],index=list(&#39;abcd&#39;))
>>> ser
a    3
b    2
c    0
d    3
dtype: int64
>>> ser.rank()
a    3.5
b    2.0
c    1.0
d    3.5
dtype: float64
>>> ser.rank(method=&#39;min&#39;)
a    3
b    2
c    1
d    3
dtype: float64
>>> ser.rank(method=&#39;max&#39;)
a    4
b    2
c    1
d    4
dtype: float64
>>> ser.rank(method=&#39;first&#39;)
a    3
b    2
c    1
d    4
dtype: float64
登入後複製

注意在 ser[0]=ser[3] 这对平级项上,不同 method 参数表现出的不同名次。

DataFrame 的 .rank(axis=0, method=&#39;average&#39;, ascending=True) 方法多了个 axis 参数,可选择按行或列分别进行排名,暂时好像没有针对全部元素的排名方法。

统计方法

pandas 对象有一些统计方法。它们大部分都属于约简和汇总统计,用于从 Series 中提取单个值,或从 DataFrame 的行或列中提取一个 Series。

比如 DataFrame.mean(axis=0,skipna=True) 方法,当数据集中存在 NA 值时,这些值会被简单跳过,除非整个切片(行或列)全是 NA,如果不想这样,则可以通过 skipna=False 来禁用此功能:

>>> df
    one  two
a  1.40  NaN
b  7.10 -4.5
c   NaN  NaN
d  0.75 -1.3

[4 rows x 2 columns]
>>> df.mean()
one    3.083333
two   -2.900000
dtype: float64
>>> df.mean(axis=1)
a    1.400
b    1.300
c      NaN
d   -0.275
dtype: float64
>>> df.mean(axis=1,skipna=False)
a      NaN
b    1.300
c      NaN
d   -0.275
dtype: float64
登入後複製

其他常用的统计方法有: 

******** **********************************#非NA 值的數量針對Series 或DF 的列計算總計統計最小值與最大值最小值與最大值的索引位置(整數)最小值和最大值的索引值樣本分位數(0 到1 )求和平均##median中位數mad#根據平均值計算平均絕對離差#var方差std標準差##樣本值的偏度(三階矩)樣本值的峰度(四階矩)樣本值的累積和樣本值的累積最大值和累積最小值
count
describe
min , max
argmin , argmax
idxmin , idxmax
quantile
sum
#mean
kurt
cumsum
cummin , cummax

cumprod

樣本值的累計積

#diff計算一階差分(對時間序列很有用)

pct_change

計算百分數變化

##處理缺失資料


###################### ###pandas 中NA 的主要表現為np.nan,另外Python 內建的None 也會被當作NA 處理。 ######處理 NA 的方法有四種:###dropna , fillna , isnull , notnull### 。 ######is(not)null######這一對方法對物件做元素級應用,然後傳回一個布林型數組,一般可用於布林型索引。 ######dropna######對於一個 Series,dropna 傳回一個只包含非空資料和索引值的 Series。 ######問題在於 DataFrame 的處理方式,因為一旦 drop 的話,至少要丟掉一行(列)。這裡的解決方式與前面類似,還是透過一個額外的參數:###dropna(axis=0, how='any', thresh=None)### ,how 參數可選的值為 any 或 all。 all 僅在切片元素全為 NA 時才拋棄該行(列)。另外一個有趣的參數是 thresh,該參數的類型為整數,它的作用是,例如 thresh=3,會在一行中至少有 3 個非 NA 值時將其保留。 ######fillna#########fillna(value=None, method=None, axis=0)### 中的value 參數除了基本型別外,還可以使用字典,這樣可以實現對不同的列填入不同的值。 method 的用法與前面 ###.reindex()### 方法相同,這裡不再贅述。 ######inplace 參數#########前面有個點一直沒講,結果整篇範例寫下來發現還挺重要的。就是 Series 和 DataFrame 物件的方法中,凡是會對陣列做出修改並傳回一個新陣列的,往往都有一個 ###replace=False### 的選用參數。如果手動設定為 True,那麼原始數組就可以被替換。 ###

以上是pandas 基礎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

解決常見的pandas安裝問題:安裝錯誤的解讀與解決方法 解決常見的pandas安裝問題:安裝錯誤的解讀與解決方法 Feb 19, 2024 am 09:19 AM

pandas安裝教學:解析常見安裝錯誤及其解決方法,需要具體程式碼範例引言:Pandas是一個強大的資料分析工具,廣泛應用於資料清洗、資料處理和資料視覺化等方面,因此在資料科學領域備受推崇。然而,由於環境配置和依賴問題,安裝pandas可能會遇到一些困難和錯誤。本文將為大家提供一份pandas安裝教程,並解析一些常見的安裝錯誤及其解決方法。一、安裝pandas

如何使用pandas正確讀取txt文件 如何使用pandas正確讀取txt文件 Jan 19, 2024 am 08:39 AM

如何使用pandas正確讀取txt文件,需要具體程式碼範例Pandas是一個廣泛使用的Python資料分析函式庫,它可以用來處理各種各樣的資料類型,包括CSV檔案、Excel檔案、SQL資料庫等。同時,它也可以用於讀取文字文件,例如txt文件。但是,在讀取txt檔案時,我們有時會遇到一些問題,例如編碼問題、分隔符號問題等。本文將介紹如何使用pandas正確讀取txt

使用pandas讀取CSV檔案並進行資料分析 使用pandas讀取CSV檔案並進行資料分析 Jan 09, 2024 am 09:26 AM

Pandas是一個強大的資料分析工具,可以輕鬆讀取和處理各種類型的資料檔案。其中,CSV檔案是最常見且常用的資料檔案格式之一。本文將介紹如何使用Pandas讀取CSV檔案並進行資料分析,同時提供具體的程式碼範例。一、導入必要的函式庫首先,我們需要導入Pandas函式庫和其他可能需要的相關函式庫,如下所示:importpandasaspd二、讀取CSV檔使用Pan

python pandas安裝方法 python pandas安裝方法 Nov 22, 2023 pm 02:33 PM

python可以透過使用pip、使用conda、從原始碼、使用IDE整合的套件管理工具來安裝pandas。詳細介紹:1、使用pip,在終端機或命令提示字元中執行pip install pandas命令即可安裝pandas;2、使用conda,在終端機或命令提示字元中執行conda install pandas命令即可安裝pandas;3、從原始碼安裝等等。

Pandas輕鬆讀取SQL資料庫中的數據 Pandas輕鬆讀取SQL資料庫中的數據 Jan 09, 2024 pm 10:45 PM

資料處理利器:Pandas讀取SQL資料庫中的數據,需要具體程式碼範例隨著資料量的不斷增長和複雜性的提高,資料處理成為了現代社會中一個重要的環節。在資料處理過程中,Pandas成為了許多資料分析師和科學家的首選工具之一。本文將介紹如何使用Pandas函式庫來讀取SQL資料庫中的數據,並提供一些具體的程式碼範例。 Pandas是基於Python的一個強大的數據處理和分

python如何安裝pandas python如何安裝pandas Dec 04, 2023 pm 02:48 PM

python安裝pandas的步驟:1、開啟終端機或指令提示字元;2、輸入「pip install pandas」指令安裝pandas函式庫;3、等待安裝完成,可以在Python腳本中匯入並使用pandas函式庫了;4、使用的是特定的虛擬環境,確保在安裝pandas之前啟動相應的虛擬環境;5、使用的是整合開發環境,可以添加“import pandas as pd”程式碼來導入pandas庫。

使用pandas讀取txt檔案的實用技巧 使用pandas讀取txt檔案的實用技巧 Jan 19, 2024 am 09:49 AM

使用pandas讀取txt檔案的實用技巧,需要具體程式碼範例在資料分析和資料處理中,txt檔案是一種常見的資料格式。使用pandas讀取txt檔案可以快速、方便地進行資料處理。本文將介紹幾種實用的技巧,以幫助你更好的使用pandas讀取txt文件,並配以具體的程式碼範例。讀取帶有分隔符號的txt檔案使用pandas讀取帶有分隔符號的txt檔案時,可以使用read_c

揭露Pandas中高效率的資料去重方法:快速去除重複資料的技巧 揭露Pandas中高效率的資料去重方法:快速去除重複資料的技巧 Jan 24, 2024 am 08:12 AM

Pandas去重方法大揭密:快速、有效率的資料去重方式,需要具體程式碼範例在資料分析和處理過程中,經常會遇到資料中存在重複的情況。重複資料可能會對分析結果產生誤導,因此去重是一個非常重要的工作環節。在Pandas這個強大的資料處理庫中,提供了多種方法來實現資料去重,本文將介紹一些常用的去重方法,並附上特定的程式碼範例。基於單列去重最常見的情況是根據某一列的值是否重

See all articles