pandas Series对象
numpyarray提供了运算基础
pandas提供了业务逻辑的处理方法
Series, DataFrame
# 导入数据分析三剑客(numpy、pandas、matplotlib)
import numpy as np
import pandas as pd
from pandas import Series, DataFrame
import matplotlib as mpl
一、Series
区分:
一维数组:有序的数据类型相同的集合
Series:一维数组的强化版,增加了像字典一样的key-value的访问机制,同时也保留了数组的索引访问机制
字典:无序的集合
Series结构
sl lucy 0
s2 mery 1
s3 tom 2
S4 jack 3
s5 tony 4
显式index data 隐式index
# Series创建(两种方式)
# 两者区别
# 列表创建的是副本,更改原列表不会影响series
# ndarray创建的是引用,更改原数组会影响series
# 1.列表创建
names = ["zhang", "wang", "zhao"]
s = Series(names)
s
"""
运行结果
0 zhang
1 wang
2 zhao
dtype: object
"""
names[0] = "n"
s
# 2.由ndarray创建
# ndarray是NumPy库中最重要的数据结构,全称为 n-dimensional array(n 维数组)。
names2 = ["li", "meng", "zhou"]
name_array = np.array(names2)
# 创建时index是键(可选),如果没有默认索引0,1,2,...
s2 = Series(name_array,index=["k1","k2","k3",])
s2
name_array[0] = "n"
name_array
# 3.字典创建
my_dict = {"k1": "zhang", "k2": "zhao", "k3": "wang"}
# Series(my_dict) # 就可以创建出来
Series(my_dict, index=["k1","k3"]) # 这样写会筛选出来k1-zhang,k3-wang两个键值对,而排除k2键值对
练习
使用多种方法创建以下Series,命名为s1:
语文150
数学150
英语150
理综300
Series([150,150,150,300], index=["语文", "数学", "英语", "理综"])
Series({"语文": 150, "数学": 150, "英语": 150, "理综": 300})
# 二、访问Series的方式,索引与切片
# pandas是基于numpy的
# 1.Series支持numpy数组的访问方式(可以但不推荐)
s3 = Series({"语文": 150, "数学": 150, "英语": 150, "理综": 300})
s3[0]
s3[[0,1]]
s3[[True,False,False,False]]
# 2.字典的方式访问
s3["语文"]
s3[["语文","数学"]]
# 3.用loc访问显式索引(官方推荐)
s3.loc["语文"]
s3.loc[["语文","英语"]]
# 4.用iloc访问隐式索引(官方推荐)
s3.iloc[0]
s3.iloc[[0,1,2]]
# 5.使用带索引的bool型的Series列表访问
# 注意:数量要一致且索引要一致
s4 = Series(data=[True,False,False, False],index=["语文", "数学", "英语", "理综"])
s3[s4]
# 当然也可用np数组或列表
n_bool = np.array([True,True,False,False])
s3[n_bool]
l_bool = [True,True,False,True]
s3[l_bool]
# 三、切片
# 四种方式:数组 字典 loc iloc
# 用标签访问的是闭区间
# 用索引访问的是开区间
s3[:1] # 开区间
s3[:"数学"] # 闭区间
s3.loc[:"数学"] # 闭区间
s3.iloc[:1] # 开区间
# 四、属性和方法
s3.shape # (4,)
s3.size # 4
s3.index # Index(['语文', '数学', '英语', '理综'], dtype='object')
s3.values # array([150, 150, 150, 300])
(s3.index == "语文").any() # np.True_
(s3.index == "俄语").any() # np.False_
s4 = Series(data=np.random.randint(0,150,4), index=s3.index)
s4
# 可以使用head(),tail()分别查看前n个和后n个值
# 是切片操作,一般用于查看数据的结构
s4.head(2)
s4.tail(2)
# 当索引没有对应的值时,可能出现缺失数据显示NaN(not a number)的情况
# 就是判读是否由NaN
s4.isnull()
s4.notnull()
s5 = Series({"语文": 150, "数学": 150, "英语": 150, "理综": 300}, index=["语文","数学","英语","物理"])
s5.isnull()
s5.isnull().any() # np.True_
s5.notnull()
# name属性
# Series对象本身及其实例都有一个name属性
s5.name = "学科成绩"
s5
# 排序
s6 = Series(np.random.randint(0,10,5), index=list("cabdj"))
# 根据索引升序排序
s6.sort_index(ascending=True)
# 根据值降序排序
s6.sort_values(ascending=False)
# 统计出现次数
s7 = Series(np.random.randint(0,10,100))
# 统计每个值出现次数
s7.value_counts()
# RFM模型
# R最近消费时间
# F 频率
# M消费金额
# 五、运算
# Series和一个数运算,遵循广播机制
s8 = Series(np.random.randint(0,10,5), index=list("ABCDE"))
s8
s8 + 1
# Series也可和np.array()运算
np_array = np.ones(5)
np_array
s8 + np_array
# 在这里,s8不能和二维np.array运算,不遵守广播,只支持索引对齐
# 但是s8.values可以
np_array2 = np.ones((2,5))
np_array2
s8.values + np_array2
# 这是因为s8.values是numpy,s8.values和np_array2是广播机制
# Series与Series之间运算
# 在运算中自动对齐不同索引的数据
# 如果索引不对应,则补NaN
s9 = Series(np.random.randint(0,10,5), index=list("ABCDE"))
s10 = Series(np.random.randint(0,10,4), index=list("ABCD"))
display(s9,s10)
s9 + s10 # 没有对应上的会返回NaN
# 若想保留空值可用以下方法
# ·add()加
# ·sub()减
# ·mul()乘
# ·div()除
s9.add(s10,fill_value=0)
# 六、Series练习
# NaN和任何数运算都是空值
# 扩展
my_dict = {"理综": 100}
my_dict["文综"] = 120
my_dict
1.随机生成两组学生成绩,一组python,一组java,学生包括lucy、mery、tom、jack
2.计算每个学生的平均成绩
3.找出python未及格的学生姓名
4.找出java未及格的学生姓名
5.如果需要给mery的python成绩加10分,如何实现
6.计算各学科的班级平均成绩
# 1.随机生成两组学生成绩
python = Series(np.random.randint(0,150,4), index=["lucy", "mery", "tom", "jack"])
java = Series(np.random.randint(0,150,4), index=["lucy", "mery", "tom", "jack"])
display(python,java)
# 2.计算每个学生的平均成绩
(python + java) / 2
# 3.找出python未及格的学生姓名
# 4.找出java未及格的学生姓名
python.loc[python < 90].index
java.loc[java < 90].index
# 5.如果需要给mery的python成绩加10分,如何实现
python.loc["mery"] += 10
python
python.mean(),java.mean() # 哦原来还可以这样输出
作者:cloud-2-jane
出处:https://www.cnblogs.com/cloud-2-jane/articles/18609815
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架