目录
Series对象创建
实例化参数
def __init__( self, data=None, index=None, dtype: Dtype | None = None, name=None, copy: bool | None = None, fastpath: bool | lib.NoDefault = lib.no_default, ) -> None:
其中data为穿入的数据,数据类型一般为array-like,也可以穿入自建类型数据,index参数为Series对象的索引,也可称作为标签,dtype为单位元素数据类型的指定,name为Series对象的名称,如将Series对象导入DataFrame中,name将默认作为列名存在
index参数
Series对象实际是具有字典属性的array-like数据类型,原因在于Series对象为一维数据,在DataFrame二维表中,每一列或行单独取出都为一个Series参数,若取行,则列名则为Series对象的index,反之若取列,则行索引为index
index可分为隐式索引和显示索引
隐式索引为常规从0开始至长度-1的index
显示索引可以手动设置index,index列表中的每一项按序作为对应元素的索引
选用array-like创建Series对象
这里选用list及ndarray作为data参数传入演示及区别详解
list
选用list对象作为数据传入Series对象进行实例化的时候,创建的为副本对象,也就是说Series与list并不共享内存
import numpy as np
import pandas as pd
data1 = pd.Series(data=[1,2,3])
print(data1)
# 0 1
# 1 2
# 2 3
# dtype: int64
ndarray
使用ndarray对象作为数据传入Series对象进行实例化的时候,创建的为一个与原ndarray共享内存的Series对象
import numpy as np
import pandas as pd
arr = np.array([1,2,3])
data1 = pd.Series(data=arr)
print(data1)
arr[1] = 100
print(data1)
# 0 1
# 1 2
# 2 3
# dtype: int32
# 0 1
# 1 100
# 2 3
# dtype: int32
可以看到在进行原ndarray的修改后Series对象也发生了改变,这里可以使用.copy()来进行深拷贝
import numpy as np
import pandas as pd
arr = np.array([1,2,3])
data1 = pd.Series(data=arr.copy())
print(data1)
arr[1] = 100
print(data1)
# 0 1
# 1 2
# 2 3
# dtype: int32
# 0 1
# 1 2
# 2 3
# dtype: int32
显示索引与隐式索引
上述的例子都为隐式索引,即不指定索引,自动生成的从0-len-1的数值索引为隐式索引,接下来进行显示索引的指定
import numpy as np
import pandas as pd
arr = ['Jack','Male']
arr1 = ['Name','Gender']
data1 = pd.Series(data=arr,index=arr1)
print(data1)
# Name Jack
# Gender Male
# dtype: object
可以看到这里的dtype变为了object类型,原因为data的属性为字符串
选用dict创建Series对象
使用dict对象创建Series对象,只需要将data赋值为dict,索引会自动选用键,如果要自定义显式索引的话,则会根据显示索引匹配字典的键,如果有匹配不成功的则会使用pd.NA,也就是空值进行填充
不指定索引
import numpy as np
import pandas as pd
dict1 = {'Name':'Jack','Gender':'Male'}
data1 = pd.Series(data=dict1)
print(data1)
# Name Jack
# Gender Male
# dtype: object
指定索引
import numpy as np
import pandas as pd
dict1 = {'Name':'Jack','Gender':'Male'}
data1 = pd.Series(data=dict1,index=['Name','Hobby'])
print(data1)
# Name Jack
# Hobby NaN
# dtype: object
这里指定了一个在字典中的键不存在的索引Hobby,因为在字典中并不存在,所以这里显示的值为pd.NA
选用标量创建Series对象
若使用标量创建Series对象,则会默认生成一个长度为1的Series对象
import numpy as np
import pandas as pd
data1 = pd.Series(data=1)
print(data1)
print(data1.shape)
# 0 1
# dtype: int64
# (1,)
使用标量创建的广播机制
如果想用标量进行广播,就要指定显式索引,这样就会根据显示索引的长度对标量进行广播
import numpy as np
import pandas as pd
data1 = pd.Series(data=1, index=[1,2,3,4,5,6,7])
print(data1)
print(data1.shape)
# 1 1
# 2 1
# 3 1
# 4 1
# 5 1
# 6 1
# 7 1
# dtype: int64
# (7,)
Series属性
Series属性一般包括以下几个
name
name:Series对象的名字,可以在Series创建时指定,在将Series对象转为DataFrame二维表后,name将作为列名存在,行索引为Series对象的原索引
import numpy as np
import pandas as pd
data1 = {'Hobby':'Basketball','Age':30}
data1 = pd.Series(data=data1,name='Jack')
data2 = pd.DataFrame(data=data1)
print(data2)
# Jack
# Hobby Basketball
# Age 30
size
size:Series对象的元素个数,也就是Series对象的长度
import numpy as np
import pandas as pd
data1 = {'Hobby':'Basketball','Age':30}
data1 = pd.Series(data=data1,name='Jack')
print(data1.size)
# 2
shape
shape:Series对象的形状
import numpy as np
import pandas as pd
data1 = {'Hobby':'Basketball','Age':30}
data1 = pd.Series(data=data1,name='Jack')
print(data1.shape)
# (2,)
index
index:Series对象的索引列表,但不是纯粹的列表,是经过封装的,并且不支持修改元素,所以若需要修改index的值,则需要整体替换index
import numpy as np
import pandas as pd
data1 = {'Hobby':'Basketball','Age':30}
data1 = pd.Series(data=data1,name='Jack')
print(data1.index)
data2 = list(data1.index)
data2[0]='jjj'
data1.index = data2
print(data1)
# Index(['Hobby', 'Age'], dtype='object')
# jjj Basketball
# Age 30
# Name: Jack, dtype: object
values
values:为Series对象的值列表,并且values是只读的,不像index可以进行修改,若想对值进行修改,可以使用索引取值,然后修改,详见下文
import numpy as np
import pandas as pd
data1 = {'Hobby':'Basketball','Age':30}
data1 = pd.Series(data=data1,name='Jack')
print(data1.values)
# ['Basketball' 30]
Series索引取值
Series对象[索引名]及Series对象.索引名
Series可以通过Series对象[索引名]进行取值,这里可以是索引名,也可以是索引列表
同样也可以通过Series对象.索引名来进行取值,但是要确保索引名和实例属性不冲突,否则会优先返回实例属性
import numpy as np
import pandas as pd
data1 = {'Hobby':'Basketball','Age':30,'name':'pig'}
data1 = pd.Series(data=data1,name='Jack')
print(data1['Hobby'])
print(data1[['Hobby','Age']])
print(data1.Hobby)
print(data1.name)
# Basketball
# Hobby Basketball
# Age 30
# Name: Jack, dtype: object
# Basketball
# Jack
可以看到这里返回的name为Jack,也就是Series对象的名字,而不是pig,原因是属性名和index发生了冲突,所以会优先返回实例属性,这里想要取出索引name对应的值,只能使用data1['name']
import numpy as np
import pandas as pd
data1 = {'Hobby':'Basketball','Age':30,'name':'pig'}
data1 = pd.Series(data=data1,name='Jack')
print(data1['name'])
# pig
Series对象.iloc[]
这里使用的iloc[]索引同样适用于DataFrame(后面会更新博客讲解,请保持关注),iloc[]索引的参数为从0-len-1的数值索引,比如这里要取第2个值就为iloc[1]
import numpy as np
import pandas as pd
data1 = {'Hobby':'Basketball','Age':30,'name':'pig'}
data1 = pd.Series(data=data1,name='Jack')
print(data1.iloc[0],data1.iloc[1])
# Basketball 30
索引取值后修改
import numpy as np
import pandas as pd
data1 = {'Hobby':'Basketball','Age':30,'name':'pig'}
data1 = pd.Series(data=data1,name='Jack')
print(data1.iloc[0],data1.iloc[1])
data1.iloc[0] = 'football'
print(data1)
# Basketball 30
# Hobby football
# Age 30
# name pig
# Name: Jack, dtype: object
import numpy as np
import pandas as pd
data1 = {'Hobby':'Basketball','Age':30,'name':'pig'}
data1 = pd.Series(data=data1,name='Jack')
data1['Hobby'] = 'football'
data1.Age = 18
print(data1)
# Hobby football
# Age 18
# name pig
# Name: Jack, dtype: object
Series数值运算
Series数值运算支持广播机制,及于numpy运算函数兼容
广播机制演示
import numpy as np
import pandas as pd
data1 = pd.Series(data=np.random.randint(1,10,5))
print(data1)
print(data1+1)
# 0 3
# 1 9
# 2 9
# 3 2
# 4 8
# dtype: int32
# 0 4
# 1 10
# 2 10
# 3 3
# 4 9
# dtype: int32
使用Numpy运算函数
import numpy as np
import pandas as pd
data1 = pd.Series(data=np.random.randint(1,10,5))
print(data1)
print(np.power(data1,2))
# 0 3
# 1 1
# 2 4
# 3 4
# 4 1
# dtype: int32
# 0 9
# 1 1
# 2 16
# 3 16
# 4 1
# dtype: int32
这里使用numpy中的power实现了一个乘方操作