【Python】【pandas-彙總2】series常用屬性和函式
阿新 • • 發佈:2019-01-30
1.Series常用屬性
屬性 | 說明 |
values | 獲取陣列 |
index | 獲取索引 |
name | values的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() | 返回含有最大值的索引位置 返回含有最小值的索引位置 |
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)