1. 程式人生 > >【Python】【pandas-彙總2】series常用屬性和函式

【Python】【pandas-彙總2】series常用屬性和函式

1.Series常用屬性

屬性說明
values獲取陣列
index獲取索引
namevalues的name
index.name索引的name

2.Series常用函式

Series可使用ndarray或dict的差不多所有索引操作和函式,集成了ndarray和dict的優點

函式

說明
Series([x,y,...])Series({'a':x,'b':y,...}, index=param1)生成一個Series
Series.copy()複製一個Series 

Series.reindex([x,y,...], fill_value=NaN)

Series.reindex([x,y,...], method=NaN)

Series.reindex(columns=[x,y,...])

重返回一個適應新索引的新物件,將缺失值填充為fill_value

返回適應新索引的新物件,填充方式為method

對列進行重新索引

Series.drop(index)丟棄指定項
Series.map(f)應用元素級函式 

排序函式

說明
Series.sort_index(ascending=True)根據索引返回已排序的新物件
Series.order(ascending=True)根據值返回已排序的物件,NaN值在末尾
Series.rank(method='average', ascending=True, axis=0)為各組分配一個平均排名

df.argmax()

df.argmin()

返回含有最大值的索引位置

返回含有最小值的索引位置

reindex的method選項:    ffill, bfill     向前填充/向後填充    pad, backfill   向前搬運,向後搬運rank的method選項    'average'    在相等分組中,為各個值分配平均排名    'max','min'   使用整個分組中的最小排名    'first'      按值在原始資料中出現的順序排名

3.Series常用屬性例程

# -*- coding: utf-8 -*-
"""
@author: 蔚藍的天空Tom
Aim:pandas.series常用屬性的例程

屬性	說明
values	  獲取陣列
index	  獲取索引
name	       values的name
index.name  索引的name

"""

import pandas as pd
from pandas import Series
if __name__=='__main__':
    s = pd.Series(['Tom', 'Kim', 'Andy'])
#   0     Tom
#    1     Kim
#   2    Andy
#    dtype: object

    #數值陣列
    s.values #['Tom' 'Kim' 'Andy']
    
    #索引序列
    s.index #RangeIndex(start=0, stop=3, step=1)
    
    #values的name
    s.name   #None
    
    #索引的name
    s.index.name  #None
    
    #設定series的name和index.name
    s.name = 'Name'
    s.index.name = 'ID'
#   ID
#   0     Tom
#   1     Kim
#   2    Andy
#   Name: Name, dtype: object

    #獲取series的name和index.name
    s.name       #Name
    s.index.name #ID

4.Series常用函式例程

4.1建立Series物件

# -*- coding: utf-8 -*-
"""
@author:蔚藍的天空Tom
Aim:實現Series常用函式的例程---生成Series物件

(1)生成一個Series
Series([x,y,...])Series({'a':x,'b':y,...}, index=param1)

"""

import pandas as pd
from pandas import Series

if __name__=='__main__':

    #(1)生成一個Series
    #Series([x,y,...])
    #Series({'a':x,'b':y,...}, index=param1)

    #陣列建立Series,使用預設整數數值行索引
    s = pd.Series(['Tom', 'Kim', 'Andy'])
#    0     Tom
#    1     Kim
#    2    Andy
#    dtype: object
 
    #陣列建立Series,指定行索引index
    s = pd.Series(['Tom', 'Kim', 'Andy'], index=['No.1', 'No.2', 'No.3'])
#    No.1     Tom
#    No.2     Kim
#    No.3    Andy
#    dtype: object

    #字典建立Series,使用預設整數數值行索引(索引名稱的字典序)
    data = {'No.2':'Tom', 'No.1':'Kim', 'No.3':'Andy'}
    s = pd.Series(data)
    s.index.name = 'ID'
    s.name='StudentsInfo'
#   ID
#   No.1     Kim
#   No.2     Tom
#   No.3    Andy
#   Name: StudentsInfo, dtype: object
    
    #字典建立Series,指定行索引的排序Index
    data = {'No.1':'Tom', 'No.2':'Kim', 'No.3':'Andy'}
    ind = ['No.3', 'No.2', 'No.1']
    s = pd.Series(data, index=ind)
#   No.3    Andy
#   No.2     Kim
#   No.1     Tom
#   dtype: object

    #字典建立Series,指定行索引的排序index
    data = {'No.1':'Tom', 'No.2':'Kim', 'No.3':'Andy'}
    ind = ['No.3', 'No.2']
    s = pd.Series(data, index=ind)
#    No.3    Andy
#    No.2     Kim
#    dtype: object

    #字典建立Series,指定行索引的排序index
    data = {'No.1':'Tom', 'No.2':'Kim', 'No.3':'Andy'}
    ind = ['No.2', 'No.1', 'No.99']
    s = pd.Series(data, index=ind)
#    No.2     Kim
#    No.1     Tom
#    No.99    NaN
#    dtype: object

    #使用pd.isnull(series)判斷series物件是否含有NaN數值
    data = {'No.1':'Tom', 'No.2':'Kim', 'No.3':'Andy'}
    ind = ['No.2', 'No.1', 'No.99']
    s = pd.Series(data, index=ind)
    ret = pd.isnull(s)
#    No.2     False
#    No.1     False
#    No.99    True
#    dtype: bool

    #使用pd.notnull(series)判斷series物件是否含有NaN數值
    data = {'No.1':'Tom', 'No.2':'Kim', 'No.3':'Andy'}
    ind = ['No.2', 'No.1', 'No.99']
    s = pd.Series(data, index=ind)
    ret = pd.notnull(s)
#   No.2      True
#   No.1      True
#   No.99    False
#   dtype: bool

4.2拷貝Series之深拷貝+淺拷貝

# -*- coding: utf-8 -*-
"""
@author:蔚藍的天空Tom
Aim:實現Series常用函式的例程----拷貝Series,深拷貝和淺拷貝

(2)複製一個Series
Series.copy()
"""

import pandas as pd
from pandas import Series

if __name__=='__main__':
    #(2)複製一個Series
    #Series.copy()
    s = pd.Series(['Tom', 'Kim', 'Andy'], index=['No.1', 'No.2', 'No.3'])
#    No.1     Tom
#    No.2     Kim
#    No.3    Andy
#    dtype: object
       
    #深拷貝series
    cpys = s.copy(deep=True)
    cpys['No.1'] = 'xxx'
    #print(cpys)
#    No.1     xxx
#    No.2     Kim
#    No.3    Andy 
#    dtype: object

    #print(s)
#   No.1     Tom
#   No.2     Kim
#   No.3    Andy
#   dtype: object

    #淺拷貝series
    cpys = s.copy(deep=False)
    cpys['No.1'] = 'xxx'
    #print(cpys)
#    No.1     xxx
#    No.2     Kim
#    No.3    Andy 
#    dtype: object

    #print(s)
#   No.1     xxx
#   No.2     Kim
#   No.3    Andy
#   dtype: object

4.3reindex函式

# -*- coding: utf-8 -*-
"""
@author:蔚藍的天空Tom
Aim:實現Series常用函式的例程---series.reindex()適應新索引的新物件,不修改源物件,返回新物件

(3)重返回一個適應新索引的新物件,將缺失值填充為fill_value
Series.reindex([x,y,...], fill_value=NaN)

(4)返回適應新索引的新物件,填充方式為method
Series.reindex([x,y,...], method=NaN)

(5)對列進行重新索引
Series.reindex(columns=[x,y,...])
"""

import pandas as pd
from pandas import Series

if __name__=='__main__':
    #Series.reindex([x,y,...])重返回一個適應新索引的新物件,缺失索引對應數值使用預設值NaN
    s = pd.Series(['Tom', 'Kim', 'Andy'], index=['No.1', 'No.2', 'No.3'])
    rs = s.reindex(['No.0', 'No.1', 'No.2', 'No.3', 'No.4'])
#No.0     NaN
#No.1     Tom
#No.2     Kim
#No.3     Andy
#No.4     NaN
#dtype: object
    
    #Series.reindex([x,y,...], fill_value=NaN)重返回一個適應新索引的新物件,缺失索引對應數值使用指定值
    s = pd.Series(['Tom', 'Kim', 'Andy'], index=['No.1', 'No.2', 'No.3'])
    rs = s.reindex(['No.0', 'No.1', 'No.2', 'No.3', 'No.4'], fill_value='XXX')
#No.0     XXX
#No.1     Tom
#No.2     Kim
#No.3     Andy
#No.4     XXX
#dtype: object

    #(4)Series.reindex([x,y,...], method=NaN) 返回適應新索引的新物件,填充方式為method
    #ffill或pad: 前向(或進位)填充 
    #bfill或backfill: 後向(或進位)填充
    s = pd.Series(['Tom', 'Kim', 'Andy'], index=['No.1', 'No.2', 'No.3'])
    rs = s.reindex(['No.0', 'No.1', 'No.4', 'No.5'], method='ffill') #method='pad'同效果
#No.0     NaN
#No.1     Tom 
#No.4    Andy #因為前向填充(取No.3的值Andy作為填充值)
#No.5    Andy #取No.4的值作為填充值
#dtype: object
    
    s = pd.Series(['Tom', 'Kim', 'Andy'], index=['No.1', 'No.2', 'No.3'])
    rs = s.reindex(['No.0', 'No.1', 'No.4', 'No.5'], method='bfill')
#No.0    Tom #因為後向填充(取No.1的值Tom作為填充值)
#No.1    Tom
#No.4    NaN
#No.5    NaN
#dtype: object

4.4drop()方法

# -*- coding: utf-8 -*-
"""
@author:蔚藍的天空Tom
Aim:實現Series常用函式的例程---drop()方法,丟棄指定項,不修改對源物件內容,返回新物件

(6)丟棄指定項
Series.drop(index)

"""

import pandas as pd
from pandas import Series

if __name__=='__main__':
    #(6)丟棄指定項Series.drop(index)
    s = pd.Series(['Tom', 'Kim', 'Andy'], index=['No.1', 'No.2', 'No.3'])
    #刪除一個元素,由索引號指定
    ds = s.drop('No.1') 
#No.2     Kim
#No.3    Andy
#dtype: object

    data = {'Name':{'No.1':'Tom', 'No.2':'Kim', 'No.3':'Andy'},
            'Age':{'No.1':18, 'No.2':16, 'No.3':19}}
    df = pd.DataFrame(data)
#      Age  Name
#No.1   18   Tom
#No.2   16   Kim
#No.3   19  Andy

    #刪除指定行
    ds = df.drop('No.1')
#      Age  Name
#No.2   16   Kim
#No.3   19  Andy

    #刪除指定列,可以產出多列,序列中指出就可以['Age','Name']
    ds = df.drop(['Age'], axis=1)
#      Name
#No.1   Tom
#No.2   Kim
#No.3  Andy

4.5series.map(func)元素函式向量化

# -*- coding: utf-8 -*-
"""
@author:蔚藍的天空Tom
Aim:實現Series常用函式的例程---應用元素級函式series.map(func),不修改源物件,返回新物件
(7)應用元素級函式
Series.map(f)

"""

import math
import pandas as pd
from pandas import Series

if __name__=='__main__':
    #(7)應用元素級函式Series.map(f)
    func = lambda x:x*2
    s = pd.Series([1, 3, 5], index=['No.1', 'No.2', 'No.3'])
    ms = s.map(func)
#No.1     2
#No.2     6
#No.3    10
#dtype: int64
    
    ms = s.map(np.exp)
#No.1      2.718282
#No.2     20.085537
#No.3    148.413159
#dtype: float64
    
    ms = s.map(math.exp)
#No.1      2.718282
#No.2     20.085537
#No.3    148.413159
#dtype: float64

4.6 series排序函式

# -*- coding: utf-8 -*-
"""
@author: 蔚藍的天空Tom
Aim:實現Series常用函式的例程---series物件排序方法

Series.sort_index(ascending=True)	根據索引返回已排序的新物件
Series.order(ascending=True)	根據值返回已排序的物件,NaN值在末尾
Series.rank(method='average', ascending=True, axis=0)	為各組分配一個平均排名
df.argmax()

df.argmin()

返回含有最大值的索引位置

返回含有最小值的索引位置

    reindex的method選項:
      ffill, bfill     向前填充/向後填充
      pad, backfill   向前搬運,向後搬運
    rank的method選項
      'average'    在相等分組中,為各個值分配平均排名
      'max','min'   使用整個分組中的最小排名
      'first'      按值在原始資料中出現的順序排名
"""

import pandas as pd
from pandas import Series

if __name__=='__main__':      
    
    #索引升序排序,Series.sort_index(ascending=True)	,預設True
    s = pd.Series([6, 2, 8], index=['No.1', 'No.2', 'No.3'])
    ss = s.sort_index(ascending=True)
#No.1    6
#No.2    2
#No.3    8
#dtype: int64
    
    #索引降序排序,Series.sort_index(ascending=Flase)
    ss = s.sort_index(ascending=False)
#No.3    8
#No.2    2
#No.1    6
#dtype: int64

    #數值升序排序 Series.sort_values(ascending=True) ,預設True
    s = pd.Series([6, 2, 8], index=['No.1', 'No.2', 'No.3'])
    so = s.sort_values(ascending=True)
#No.2    2
#No.1    6
#No.3    8
#dtype: int64

    #數值降序排序 Series.sort_values(ascending=False) 
    so = s.sort_values(ascending=False)  
#No.3    8
#No.1    6
#No.2    2
#dtype: int64



4.7rank()排名方法

# -*- coding: utf-8 -*-
"""
@author: 蔚藍的天空Tom
Aim:實現Series的排名方法例程---series.rank()
Aim:注意區分排名和排序的區別, 排名是按照排序(降序/升序)結果,用排名數值(1~n),替換數值,則每個數值對應一個排名
#排名(Series.rank(method='average', ascending=True))的作用與排序的不同之處是:
#他會把物件的 values 替換成名次(從 1 到 n),問題待解決問題:如何處理平級項,
#method 引數有四個值可選:average, min, max, first來處理評級項問題。
Note:此處排序採用升序排序,然後排名以升序排序的結果進行排名。對降序排序的排名道理都是一樣的,此處不予展示了。
"""

import pandas as pd
from pandas import Series

if __name__=='__main__':
    s = pd.Series([6,9,6,2])
    s.index.name='ID'
#ID
#0    6
#1    9
#2    6
#3    2

    #平均排名,rank()的method預設為average,如果存在評級項,則排名為名次/m,m為評級項元素個數
    sr = s.rank()
#ID
#0    2.5  #兩個6,排名2和3,平均排名為2.5
#1    4.0
#2    2.5 #兩個6,排名2和3,平均排名為2.5
#3    1.0
    
    #平均排名,顯示呼叫method=average
    sr = s.rank(method='average')
#ID
#0    2.5
#1    4.0
#2    2.5
#3    1.0
#dtype: float64
    
    #最小值排名
    sr = s.rank(method='min')
#ID
#0    2.0 #兩個6,排名2和3,最小排名都為2
#1    4.0
#2    2.0 #兩個6,排名2和3,最小排名都為2
#3    1.0
#dtype: float64
    
    #最大值排名
    sr = s.rank(method='max')
#ID
#0    3.0 #兩個6,排名2和3,最大排名都為3
#1    4.0
#2    3.0 #兩個6,排名2和3,最大排名都為3
#3    1.0
#dtype: float64
    
    #第一排名
    sr = s.rank(method='first')
#ID
#0    2.0 #兩個6,排名2和3,first排名時第一個6排名取2
#1    4.0
#2    3.0 #兩個6,排名2和3,first排名時第二個6排名取3
#3    1.0
#dtype: float64

4.8最大值/最小值的行索引方法argmin()、argmax()

# -*- coding: utf-8 -*-
"""
@author: 蔚藍的天空Tom
Aim:Series中最大(最小)數值的索引方法例程----argmax()、argmin()
df.argmax() 返回含有最大值的索引位置
df.argmin() 返回含有最小值的索引位置
"""

import pandas as pd
from pandas import Series

if __name__=='__main__':
    s = pd.Series([6,8,9,2], index=['No.1','No.2','No.3','No.4'])
#No.1    6
#No.2    8
#No.3    9
#No.4    2
#dtype: int64

    ind = s.argmax()
#No.3
    ind = s.argmin()
#No.4
    v = ss[ss.argmin()]
#2
    v = ss.min()
#2

    #排序對argmin()、argmax()結果沒有影響
    ss = s.sort_values(ascending=False)
#No.3    9
#No.2    8
#No.1    6
#No.4    2
#dtype: int64
    ind =ss.argmax()
#No.3
    v = ss[ss.argmax()]
#9
    v = ss.max()
#9

(end)