# Pandas 核心处理方法
# 什么是 Pandas
Pandas 是一个基于 Python 的开源数据分析和数据处理库
它提供了两种核心数据结构:
数据结构 | 描述 | 类似于 | 索引 | 数据存储 | 类比 |
---|---|---|---|---|---|
Series |
一维带标签的数组 | 一列 | 单索引 | 同质化 | Excel 单列 |
DataFrame |
二维带标签的表格数据结构 | 一张表格(像 Excel 表) | 双索引 | 各个列之间可以是不同的 | 整个 Excel 表格 |
应用场景:
- 数据预处理(机器学习前)
- 数据统计分析
- 自动化报表
- 数据可视化前处理
# Series
Series 就像这样:
Series Index | Series Name |
---|---|
1 | Series Values |
2 | Series Values |
3 | Series Values |
# 创建方法
# series 的创建 | |
import pandas as pd | |
s = pd.Series([1,2,3,4,5]) | |
print(s) | |
# 自定义索引 | |
s = pd.Series([1, 2, 3, 4, 5], index=['a', 'b', 'c', 'd', 'e']) | |
print(s) | |
# 定义 Name | |
s = pd.Series([1, 2, 3, 4, 5], index=['a', 'b', 'c', 'd', 'e'], name='我是xxx') | |
print(s) |
左侧是索引,右侧是值
0 1
1 2
2 3
3 4
4 5
dtype: int64a 1
b 2
c 3
d 4
e 5
dtype: int64a 1
b 2
c 3
d 4
e 5
Name: 我是 xxx, dtype: int64
# 通过字典方式来创建 | |
s = pd.Series({'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}) | |
print(s) | |
# 通过 Series 对象来创建(截取) | |
s1=pd.Series(s,index=['a','c']) | |
print(s1) |
# 基本属性
属性 | 说明 | 示例 |
---|---|---|
index |
行索引(标签)对象 | s.index |
values |
数据值组成的 numpy 数组 |
s.values |
dtype |
数据类型 | s.dtype |
size |
元素总个数 | s.size |
shape |
数据结构的形状(长度,) | s.shape |
ndim |
维度,Series 永远是 1 | s.ndim |
name |
Series 的名称(可自定义) | s.name |
is_unique |
是否全是唯一值 | s.is_unique |
hasnans |
是否含有缺失值(NaN) | s.hasnans |
# Series 对象属性 | |
s = pd.Series([1, 2, 3, 4, 5], index=['a', 'b', 'c', 'd', 'e']) | |
print(s.values) | |
print(s.index) | |
print(s.name) | |
print(s.dtype) | |
print(s.size) | |
print(s.empty) | |
print(s.ndim) | |
print(s.shape) | |
print(s.is_unique) | |
print(s.loc['e']) # 通过索引获取,显示索引 | |
print(s.iloc[4]) # 通过位置获取,隐式索引 | |
# 支持切片 | |
print(s.loc['a':'d']) | |
print(s.iloc[0:3]) |
# 访问数据
print(s.iloc[2]) | |
print(s['b']) | |
print(s[s < 3]) # 布尔索引 | |
print(s.isin([1, 2, 3])) | |
print(s[s.isin([1, 2, 3])]) |
s = pd.Series([1, np.nan, 3, None, 5, 6, 7, 8, 9, 10], index=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'], name='testData') | |
s.head() | |
s.tail(2) |
# 计算与常用统计方法
# 所有描述信息的语句 | |
s.describe() |
# 是否包含在其中 | |
s.isin([1, 9, 3]) |
# 排序 | |
s.sort_values() |
# 分位数 | |
s.quantile(0.5) |
# 统计个数 | |
s.value_counts() |
# 众数 | |
s.mode() |
# Series 案例
创建一个包含十名学生数学成绩的 Series,成绩范围在 50 到 100 间,计算平均分、最高分、最低分、并找出高于平均分的学生人数。
print(scores.mean()) | |
print(scores.max()) | |
print(scores.min()) | |
print(scores[scores.mean() < scores].count()) |
给定某城市一周每天的最高温度 Series,完成以下任务:
找出温度超过 30 度的天数
计算平均温度将温度从高到低排序
找出温度变化最大的两天
print(temperatures[temperatures > 30].count()) | |
print(temperatures.sort_values(ascending=False)) | |
temperatures.diff().abs().sort_values(ascending=False).head(2) |
股票价格分析给定某股票连续 10 个交易日的收盘价 Series:
计算每日收益率 (当日收盘价 / 前日收盘价 - 1)
找出收益率最高和最低的日期
计算波动率 (收益率的标准差)
# 计算收益率 pct->percent | |
price.pct_change() | |
a = price.pct_change() | |
a.idxmax() | |
price.pct_change().idxmin() | |
price.pct_change().std() |
某产品过去 12 个月的销售量 Series:
计算季度平均销量 (每 3 个月为一个季度)
找出销量最高的月份
计算月环比增长率
找出连续增长超过 2 个月的月份
# resample->qs 按照季度开始重新采样 | |
sales.resample('QS').mean() | |
sales.idxmax() | |
# 月百分比变化,即为环比 | |
sales.pct_change() | |
# 环比大于零,使用滑动窗口,和为 3 | |
pct_c = sales.pct_change() | |
b = pct_c > 0 | |
b[b.rolling(window=3).sum() == 3].keys().tolist() |
某商店每小时销售额 Series:
按天重采样计算每日总销售额
计算每天营业时间 (8:00-22:00) 和非营业时间的销售额比例
找出销售额最高的 3 个小时
hourly_sales.resample('D').sum() | |
# 两种方法 | |
hourly_sales[(hourly_sales.index.hour>=8)&(hourly_sales.index.hour<=22)].sum() | |
hourly_sales.between_time('8:00', '22:00') | |
# 最终计算 | |
hourly_sales[(hourly_sales.index.hour>=8)&(hourly_sales.index.hour<=22)].sum()/(hourly_sales.sum() - hourly_sales[(hourly_sales.index.hour>=8)&(hourly_sales.index.hour<=22)].sum()) | |
# 可在全部的索引中去除营业索引 | |
hourly_sales.drop(hourly_sales[(hourly_sales.index.hour>=8)&(hourly_sales.index.hour<=22)].index) | |
# 销售额最高的 3 个小时,两种方法 | |
hourly_sales.sort_values(ascending=False).head(3) | |
hourly_sales.nlargest(3).keys() |