1、series基本概念

import numpy as np
import pandas as pd

# Series 数据结构
# Series 是带有标签的一维数组,可以保存任何数据类型(整数,字符串,浮点数,Python对象等),轴标签统称为索引

ar = np.random.rand(10)
print(ar, type(ar))
ar1 = pd.Series(ar)
print(ar1, type(ar1))

print(list(ar1.index), type(ar1.index))
print(ar1.values, type(ar1.values))

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

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

# Series 创建方法一:由字典创建,字典的key就是index,values就是values

# dic = {'a': 1, 'b': 2, 'c': 3}
dic = {'a': 1, 'b': 2, 2: 'lkjk'}
s = pd.Series(dic)
print(s)
# series的索引和values可以有多个类型

# Series 创建方法二:由数组创建(一维数组)
ar = np.random.rand(5)
s = pd.Series(ar)
print(s)
# 默认index是从0开始,步长为1的数字

s = pd.Series(['a', 'b', 'c', 'd', 'e'], index=ar, dtype = object)
print(s)
# index参数:设置index,长度保持一致
# dtype参数:设置数值类型

# Series 创建方法三:由标量创建

s = pd.Series(10, index=np.random.rand(5))
print(s)
# 如果data是标量值,则必须提供索引。该值会重复,来匹配索引的长度

# Series 名称属性:name

s = pd.Series(range(6))
print(s, s.name)
s2 = pd.Series(range(6), name='hello')
print(s2, s2.name, type(s2.name))
# name为Series的一个参数,创建一个数组的 名称
# .name方法:输出数组的名称,输出格式为str,如果没用定义输出名称,输出为None

s2 = s2.rename('who am i')
print(s2.name)
# .rename()重命名一个数组的名称,并且新指向一个数组,原数组不变

2、series基本概念作业

import numpy as np
import pandas as pd

# 作业1:分别由字典、数组的方式,创建以下要求的Series

arr = [90, 92, 89, 65]
iArr = ['Jack', 'Marry', 'Tom', 'Zack']
s = pd.Series(arr, index=iArr, dtype=float, name='first series')
print(s)

map = {'Jack': 90, 'Marry': 92, 'Tom': 89, 'Zack': 65}
s = pd.Series(map, dtype=float, name='second series')
print(s)

3、series数据结构:索引

import numpy as np
import pandas as pd

# 位置下标,类似序列

s = pd.Series(np.random.rand(10))
print(s)
print(s[0], type(s[0]), s[0].dtype)
print(s[[2,1]])
# 索引下标定位和数组不同,负数下标会直接报错,不能表示倒叙下标
# print(s[-1])

# 标签索引

# 从标签索引看Series和字典不同的地方在于Series的key可以重复,而字典不会
s = pd.Series(np.random.rand(5), index=['a', 'b', 'c', 'd', 'e'])
print(s)
print(s['a'], type(s['a']), s['a'].dtype)
print(s[['b', 'b', 'a']])
# 如果需要选择多个标签的值,用[[]]来表示(相当于[]中包含一个列表)
# 多标签索引结果是新的数组,同时顺序可以改变

# 切片索引
s1 = pd.Series(np.random.rand(5))
s2 = pd.Series(np.random.rand(5), index=['a', 'b', 'c', 'd', 'e'])
print(s1[1:3])
print(s2['b':'d'])
# 注意:用index做切片是末端包含

# 如果切片索引恰好是数字,使用数字切片时默认使用下标切片
s3 = pd.Series(np.random.rand(5), index=[0, 2, 4, 6, 8])
print(s3[2:5])

print(s1[:-1])
print(s1[::2])
# 下标索引做切片,和list写法一样

# 布尔型索引

s = pd.Series(np.random.rand(6) * 100)
s[6] = None  # 添加一个空值
bs1 = s > 50
bs2 = s.isnull()
bs3 = s.notnull()
print(s, bs1, bs2, bs3)
print(bs1.dtype, bs2.dtype, bs3.dtype)

print(s[bs1])
print('------------------------')
print(s[bs2])
print('------------------------')
print(s[bs3])
print('------------------------')
print(s[s > 50])
print('------------------------')

4、series数据结构:索引作业

import numpy as np
import pandas as pd

# 作业1:创建一个Series,包含10个元素,且每个值为0-100的均匀分布随机值,index为a-j,请分别筛选出:
# ① 标签为b,c的值为多少
# ② Series中第4到6个值是哪些?
# ③ Series中大于50的值有哪些?

s = pd.Series(np.random.rand(10) * 100, index=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'])
print(s)
print(s[['b', 'c']])
print(s['b':'c'])
print(s[3:6])
print(s[s > 50])

5、series基本技巧

import numpy as np
import pandas as pd

# 数据查看

s = pd.Series(np.random.rand(10))
print(s.head(2))
print(s.tail())
# .head()查看头部数据
# .tail()查看尾部数据
# 默认查看5条

# 重新索引reindex
# .reindex将会根据索引重新排序,如果当前索引不存在,则引入缺失值

s = pd.Series(np.random.rand(4), index=['a', 'b', 'c', 'd'])
s1 = s.reindex(['c', 'f', 'd', 'a'])
print(s)
print(s1)
# .reindex()中也是写列表
# 这里'f'索引不存在,所以值为NaN

s2 = s.reindex(['c', 'f', 'd', 'a'], fill_value=666)
print(s2)
# fill_value参数:填充缺失值的值

# Series对齐

s1 = pd.Series(np.random.rand(3), index=['Jack','Marry','Tom'])
s2 = pd.Series(np.random.rand(3), index=['Wang','Jack','Marry'])
print(s1)
print(s2)
print(s1+s2)

# Series 和 ndarray 之间的主要区别是,Series 上的操作会根据标签自动对齐
# index顺序不会影响数值计算,以标签来计算
# 空值和任何值计算结果扔为空值

# 删除:.drop

s = pd.Series(np.random.rand(5), index=list('lkjer'))
s1 = s.drop('k')
s2 = s.drop(['j', 'k'])
print(s)
print(s1)
print(s2)
# drop 删除元素之后返回副本(inplace=False)

# 添加

s1 = pd.Series(np.random.rand(5))
s2 = pd.Series(np.random.rand(5), index=list('kjwer'))
print(s1)
print(s2)
s1[6] = 222
s2['a'] = 333
print(s1)
print(s2)
# 直接通过下标索引/标签index添加值

s3 = s1.append(s2)
print(s3)
# 通过.append方法,直接添加一个数组
# .append方法生成一个新的数组,不改变之前的数组

6、series基本技巧作业

import numpy as np
import pandas as pd

# 作业1:如图创建Series,并按照要求修改得到结果

i = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
s = pd.Series(values, index=i)
print(s)
s.drop('b', inplace=True)
print(s)
s['a', 'e', 'f'] = 100
print(s)

s2 = pd.Series(np.arange(10), index=list('abcdefghij'))
print(s2)
s2.drop('b', inplace=True)
print(s2)
s2[list('aef')] = 100
print(s2)

# 作业2:已有s1,s2(值为0-10的随机数),请求出s1+s2的值

s = pd.Series(np.random.rand(5) * 10, index=list('abcde'))
print(s)
s2 = pd.Series(np.random.rand(5) * 10, index=list('cdefg'))
print(s2)
print(s + s2)