Python学习笔记·第21天:跟董付国老师学Pandas——像操作Excel一样处理数据
一、Pandas是什么大白话Pandas是Python数据分析的核心工具。NumPy是“科学计算器”负责快速算Pandas是“数据表格处理器”负责处理像Excel表格一样的数据。Pandas提供了三种核心数据结构Series带标签的一维数组像一列数据每行有名字DataFrame带标签的二维表格像一个完整的Excel表格时间序列以日期时间为索引的Series二、Series一维数组2.1 创建Seriesimportpandasaspd# 自动创建从0开始的整数索引s1pd.Series(range(1,20,5))# [1, 6, 11, 16]# 使用字典创建字典的键作为索引s2pd.Series({语文:90,数学:92,Python:98,物理:87,化学:92})理解Series就像一列有名字的数据。普通列表用0、1、2做下标Series可以自定义下标比如用“语文”“数学”做下标。2.2 Series的常用操作# 修改指定索引对应的值s1[3]-17s2[语文]94# 数学运算和NumPy一样逐元素运算abs(s1)# 所有元素求绝对值s15# 所有元素加5s2**0.5# 所有元素求平方根# 条件筛选和NumPy布尔索引一样s2[s290]# 分数大于90的科目s2[s2s2.median()]# 大于中值的分数# 统计操作s2.argmax()# 最大值对应的索引s2.median()# 中值中位数s2.nsmallest(2)# 最小的2个值s2.between(90,94)# 判断每个值是否在90-94之间s2.std()# 标准差s2.var()# 无偏方差s2.sem()# 无偏标准差# 其他操作s2.add_prefix(科目:)# 索引前面加前缀s2.add_suffix(分)# 索引后面加后缀s2.hist()# 画直方图统计每个值出现的次数# 两个Series运算只对共同索引对应的值计算pd.Series(range(5))pd.Series(range(5,10))# 索引相同的相加2.3 pipe()和apply()大白话这两个方法都是对Series里的每个元素做同样的操作。# pipe()链式调用把一个操作的结果传给下一个操作pd.Series(range(5)).pipe(lambdax:x3).pipe(lambdax:x*3)# 先全部加3再全部乘3# apply()对每个值做函数运算pd.Series(range(5)).apply(lambdax:x3)pipe和apply的区别apply对每个元素单独操作pipe对整个Series操作可以链式连续处理。三、时间序列3.1 生成时间序列# date_range()生成连续日期时间pd.date_range(start20190601,end20190630,freq5D)# 每5天pd.date_range(start20190601,end20190630,freqW)# 每周pd.date_range(start20190601,periods5,freq2D)# 每2天生成5个pd.date_range(start20190601,periods8,freq3H)# 每3小时生成8个freq常用参数参数含义示例D天每天W周每周H小时每小时T分钟每分钟M月末最后一天每月末MS月初第一天每月初Y年末最后一天每年末AS年初第一天每年初3.2 时间序列操作# 使用日期时间做索引创建Seriesdatapd.Series(indexpd.date_range(start20190701,periods24,freqH),datarange(24))# 重采样resample按新时间间隔重新统计data.resample(3H).mean()# 每3小时采样计算平均值data.resample(5H).sum()# 每5小时采样求和data.resample(5H).ohlc()# 每5小时统计开盘、最高、最低、收盘值# 时间操作data.indexpd.Timedelta(1D)# 索引加一天# Timestamp单个时间操作pd.Timestamp(20190323).weekday_name# 查看是周几pd.Timestamp(201909300800).is_leap_year# 查看是不是闰年daypd.Timestamp(20191025)day.quarter# 查看所在季度day.month# 查看所在月份ohlc()解释就像看股票K线图。OOpen第一个值HHigh最大值LLow最小值CClose最后一个值四、DataFrame二维表格4.1 DataFrame的结构大白话DataFrame就是一个完整的Excel表格有三个核心部分index索引行标签标识每一行columns列名列标签标识每一列values值表格里的实际数据4.2 创建DataFrameimportnumpyasnpimportpandasaspd# 方式1用随机数直接创建dfpd.DataFrame(np.random.randint(1,20,(5,3)),indexrange(5),columns[A,B,C])# 方式2用字典创建字典的键自动成为列名dfpd.DataFrame({语文:[87,79,67,92],数学:[93,89,80,77],英语:[90,80,70,75]},index[张三,李四,王五,赵六])# 方式3时间序列做索引dfpd.DataFrame(np.random.randint(5,15,(13,3)),indexpd.date_range(start201907150900,end201907152100,freqH),columns[熟食,化妆品,日用品])# 方式4自动填充对齐短的列会自动扩展到和长列一样长dfpd.DataFrame({A:range(5,10),B:3})# B列只有一个值3会自动填充到和A列一样的行数4.3 理解DataFrame的结构以第二个例子为例语文 数学 英语 ← columns列名 张三 87 93 90 李四 79 89 80 ← values值 王五 67 80 70 赵六 92 77 75 ↑ index索引今日核心总结Pandas三大数据结构Series带标签的一维数组像一列数据时间序列以日期时间为索引的SeriesDataFrame带标签的二维表格像Excel表格Series核心操作支持NumPy的所有数学运算逐元素运算支持布尔索引条件筛选pipe()链式处理apply()逐元素处理两个Series运算时只计算共同索引对应的值时间序列date_range()生成连续日期时间resample()重新采样按新时间间隔统计ohlc()像股票数据一样统计开高低收DataFrame创建用字典创建最方便字典的键变成列名短的列会自动填充到和长列一样长支持自定义索引字符串、时间序列等结合你的项目想一想Series图书管理系统中把图书价格做成一个Series用书名做索引可以直接prices[Python编程]查看某本书的价格DataFrame把所有图书数据做成一个DataFrame列名是“书名、作者、价格、库存”每行是一本书重采样以后做CEMS数据分析时原始数据是每分钟一条用resample(1H).mean()就能得到每小时的平均排放浓度注:已经使用DeepSeek进行整理精简核心内容些许不理解的配合个人笔记进行理解。