首页 > 技术文章 > Pandas之Series简介

Franciszw 2020-10-25 00:20 原文

#jupyter-notebook常用快捷键
执行当前cell:Ctrl+enter
插入一个cell:Alt+enter
新增一个cell:shift+enter

Series介绍

#1.Series的索引和值
import numpy as np
import pandas as pd

s = pd.Series(np.random.rand(5))
print(s.index)
print(s.values)
#可以看出:索引是一个生成器,值是一个nd数组

# .index查看series索引,类型为rangeindex
# .values查看series值,类型是ndarray

# 核心:series相比于ndarray,是一个自带索引index的数组 → 一维数组 + 对应索引
# 所以当只看series的值的时候,就是一个ndarray
# series和ndarray较相似,索引切片功能差别不大
# series和dict相比,series更像一个有顺序的字典(dict本身不存在顺序),其索引原理与字典相似(一个用key,一个用index)
RangeIndex(start=0, stop=5, step=1)
[0.31784781 0.78704873 0.61291665 0.03719027 0.71440122]
0.3178478083913676

创建Series的方法

#2.创建Series的方法
pandas.Series(data=None,index=None, dtype=None, name=None, copy=False, fastpath=False)
#data 需要是一个可排序的可迭代对象,可以是列表,字典,元组,一维数组,一个标量值,但是不能是集合
#dtype 规定元素的格式,如果有数字有字符串就用object
#index 数据自带了就用,数据没自带就用自然数,认为规定了就用规定的,如果数据自带了索引你还认为规定索引,就用你的索引生成一堆空值
#name s.name输出数组的名称,输出格式为str,如果没用定义输出名称,输出为None,rename生成一个新的s对象
data0 = [1,2,3,4,5]
data1 = {'a':1,'b':2,'c':3,'d':4,'e':5}
data2 = (1,2,3,4,5)
data3 = np.random.rand(5)
data4 = 'a'
data5 = 1
s0 = pd.Series(data0,index=list('abcde'))
s1 = pd.Series(data1,index=list(range(5)))
s1_1 = pd.Series(data1)
s2 = pd.Series(data2,index=list('abcde'))
s3 = pd.Series(data3)
s4 = pd.Series(data4,index=list(range(5)))
s5 = pd.Series(data5,index=list(range(5)))
print(s0,s1,s2,s3,s4,s5)
# 注意:key肯定是字符串,假如values类型不止一个会得到一个类型为object的类型
#      如果强行给字典加index,会使用你的index但是值全为空,
#      单个标量时,s的长度由index控制
a    1
b    2
c    3
d    4
e    5
dtype: int64 0   NaN
1   NaN
2   NaN
3   NaN
4   NaN
dtype: float64 a    1
b    2
c    3
d    4
e    5
dtype: int64 0    0.588359
1    0.556708
2    0.857709
3    0.174475
4    0.849556
dtype: float64 0    a
1    a
2    a
3    a
4    a
dtype: object 0    1
1    1
2    1
3    1
4    1
dtype: int64

Series 索引

#3.Series:索引使用

# 下标索引,标签索引,切片索引,布尔型索引
#下标索引:按位置取值,只是不能取-1
s = pd.Series(list(range(5)),index=list('abcde'))
print(s)
print(s[0],type(s[0])) #按位置取一个值,返回具体值
print(s[[0,2]],type(s[[0,2]])) #按位置取多个值,多个值一定要放到一个列表里,返回一个s对象
a    0
b    1
c    2
d    3
e    4
dtype: int64
0 <class 'numpy.int64'>
a    0
c    2
dtype: int64 <class 'pandas.core.series.Series'>
#标签索引:按index取值,和字典取值差不多
print(s['a'])
print(s.get(2)) #这里get的使用和字典类似
print(s[['a','b']])
0
2
a    0
b    1
dtype: int64
#切片索引:用法和列表的切片类似,[起:终:步长],还可以用index做切片
print(s[0:3]) #不包含尾部
print(s['a':'d']) #包含尾部
a    0
b    1
c    2
dtype: int64
a    0
b    1
c    2
d    3
dtype: int64
#布尔索引:根据布尔值来取数据
s = pd.Series(np.random.rand(5)*100)
s[5] = None
print(s)
s1 = s>50 #s1的值就全部变成布尔值了
print(s1)
# .isnull() / .notnull() 判断是否为空值 (None代表空值,NaN代表有问题的数值,两个都会识别为空值)
s2 = s.isnull()
s3 = s.notnull()
print(s2)
print(s3)
0     52.114
1    39.3662
2    56.7546
3    19.6864
4     4.7018
5       None
dtype: object
0     True
1    False
2     True
3    False
4    False
5    False
dtype: bool
0    False
1    False
2    False
3    False
4    False
5     True
dtype: bool
0     True
1     True
2     True
3     True
4     True
5    False
dtype: bool

Series 基本使用

#4.Series 基本使用
# 重新索引 / 对齐 / 添加、修改、删除值
#重新索引:得到一个新的s对象,该对象按新索引排序,如果索引有对于值则拿过来用,索引无值默认用NaN填充,fill_value指定填充值
s = pd.Series([1,2,3,4,5],index=list('abcde'))
s1 = s.reindex(list('cdefa'))
s2 = s.reindex(list('cdefa'),fill_value=0)
print(s)
print(s1)
print(s2)
a    1
b    2
c    3
d    4
e    5
dtype: int64
c    3.0
d    4.0
e    5.0
f    NaN
a    1.0
dtype: float64
c    3
d    4
e    5
f    0
a    1
dtype: int64
#对齐(加减):两个s对象相加减的时候,自动对齐索引相同的数据,索引不同的数据结果都是NaN
s1 = pd.Series([1,2,3,4,5],index=list('abcde'))
s2 = pd.Series([6,7,8,9,0],index=list('cdefg'))
s3 = pd.Series([1,2,3,4,5])
s4 = pd.Series([6,7,8,9,0])
print(s1+s2)
print(s3+s4)
print(s1+s3) #两种不同的索引相加
a     NaN
b     NaN
c     9.0
d    11.0
e    13.0
f     NaN
g     NaN
dtype: float64
0     7
1     9
2    11
3    13
4     5
dtype: int64
a   NaN
b   NaN
c   NaN
d   NaN
e   NaN
0   NaN
1   NaN
2   NaN
3   NaN
4   NaN
dtype: float64
#删除值
s = pd.Series(list(range(5)),index=list('abcde'))
print(ds1)
print(s)
ds2 = s.drop('e') #默认不修改原s对象,并返回一个修改后的对象
# ds2 = s.drop(0) 这句会报错,因为定义了索引之后,只能用索引值drop
print(ds2) 
print(s)

s1 = pd.Series(list(range(5)))
ds1 = s1.drop(0) #没定义索引的可以这样用



#增加值,修改值:和字典用法类似
s['a'] = 100
s[2] = 200
s['f'] = 300
s2 = s.append(pd.Series(list(range(5,9)))) #被append的对象也得是个s对象
print(s)
print(s2)
1    1
2    2
3    3
4    4
dtype: int64
a    0
b    1
c    2
d    3
e    4
dtype: int64
a    0
b    1
c    2
d    3
dtype: int64
a    0
b    1
c    2
d    3
e    4
dtype: int64
a    100
b      1
c    200
d      3
e      4
f    300
dtype: int64
a    100
b      1
c    200
d      3
e      4
f    300
0      5
1      6
2      7
3      8
dtype: int64

推荐阅读