数据分析——数据可视化(二)
Pandas的定义
Pandas是一个开源的Python库,专为数据操作和分析设计。它提[]供高性能、易用的数据结构和工具,尤其适合处理结构化数据(如表格数据)。Pandas的核心是两种数据结构:Series(一维数据)和DataFrame(二维表格数据)。
主要功能
- 数据清洗:处理缺失值、重复数据、数据类型转换等。
- 数据操作:支持合并、分组、排序、过滤等操作。
- 时间序列处理:支持日期范围生成、频率转换、滑动窗口计算等。
- 输入/输出工具:支持从CSV、Excel、SQL、JSON等多种格式读写数据。
Pandas常与NumPy、Matplotlib等库结合使用,构成Python数据科学生态的核心工具链。
Series和DataFrame的区别
| 特性 |
Series |
DataFrame |
| 维度 | 一维 | 二维 |
| 索引 | 单索引 | 行索引+列名 |
| 数据存储 | 同质化数据类型 | 各列可不同数据类型 |
| 类比 | Excel单列 | 整张Excel工作表 |
| 创建方式 | pd.Series([1, 2, 3]) | pd.DataFrame({'col':[1, 2, 3]}) |
Series的创建
创建Series的基本方法
在Python的pandas库中,Series是一种一维的、带有标签的数据结构,可以存储任何数据类型。以下是创建Series的几种常见方式:
从列表创建
import pandas as pd
data = [1, 2, 3, 4]
s = pd.Series(data)
从字典创建(字典键自动成为索引)
data = {'a': 1, 'b': 2, 'c': 3}
s = pd.Series(data)
从NumPy数组创建
import numpy as np
arr = np.array([1, 2, 3])
s = pd.Series(arr)
自定义索引
可以在创建时指定自定义索引:
data = [10, 20, 30]
index = ['x', 'y', 'z']
s = pd.Series(data, index=index)
s1 = pd.Series(s,['x', 'z']) # 获取 s 中下标为 x和z 的元素
print(s1)
指定数据类型
创建时可以明确指定数据类型:
s = pd.Series([1, 2, 3], dtype='float64')
创建空Series
可以创建一个空的Series对象:
s = pd.Series(dtype='float64')
从标量值创建
当传递单个标量值时,需要指定索引以确定Series长度:
s = pd.Series(5, index=['a', 'b', 'c'])
注意事项
- 当从字典创建时,Series会按照索引排序,而不是字典的原始顺序
- 如果指定了索引但数据中没有对应值,会显示为NaN(缺失值)
- Series支持多种数据类型,包括整数、浮点数、字符串、Python对象等
Series的属性
series的属性
在Python的pandas库中,Series是一种一维数组结构,能够存储任何数据类型(整数、字符串、浮点数、Python对象等)。以下是Series的主要属性及其说明:
dtype
返回Series中数据的数据类型。如果Series包含多种数据类型,返回object。
shape
返回Series的形状,格式为(n,),其中n是Series的长度。
index
返回Series的索引对象。默认情况下为RangeIndex,也可以自定义索引。
values
返回Series的数据部分,以NumPy数组形式呈现。
name
返回Series的名称(如果有)。可以通过赋值修改名称。
size
返回Series中元素的数量。
empty
返回布尔值,表示Series是否为空。
nbytes
返回Series数据占用的字节数。
hasnans
返回布尔值,表示Series是否包含NaN值。
at / iat
用于快速访问单个元素(基于标签或整数位置)。
loc / iloc
用于基于标签或整数位置的索引或切片操作。
示例代码
import pandas as pd
# 创建Series
data = pd.Series([10, 20, 30, 40], index=['a', 'b', 'c', 'd'], name='example')
# 访问属性
print("dtype:", data.dtype)
print("shape:", data.shape)
print("index:", data.index)
print("values:", data.values)
print("name:", data.name)
print("size:", data.size)
print("empty:", data.empty)
print("nbytes:", data.nbytes)
print("hasnans:", data.hasnans)
print(s.loc['b']) # 显式索引
print(s.loc['a':'c']) # 显式索引切片用法
print(s.iloc[1]) # 隐式索引
print(s.iloc[1:3]) # 隐式索引切片用法
print(s.at['b']) # 单个显式索引
print(s.iat[1]) # 单个隐式索引
输出说明
- dtype:通常为
int64、float64或object。 - shape:如
(4,)表示长度为4的一维数据。 - index:显示索引标签(如
Index(['a', 'b', 'c', 'd'], dtype='object'))。 - values:显示底层NumPy数组(如
[10 20 30 40])。 - name:若未指定则为
None。 - size:返回元素数量(如
4)。 - empty:
False表示非空。 - nbytes:数据占用的总字节数(如
32表示4个8字节整数)。 - hasnans:
False表示无NaN值。
注意事项
- 如果数据包含混合类型(如整数和字符串),
dtype会返回object。 - 修改
values数组可能会直接影响Series的数据(因为返回的是视图而非副本)。 - 使用
loc和iloc时需确保索引或位置有效,否则会引发KeyError或IndexError。
访问Series数据
基本用法
import pandas as pd
# 创建Series
data = pd.Series([10, 20, 30, 40, 50, 60], index=['a', 'b', 'c', 'd', 'e', 'f'], name='example')
# 访问数据
print(1) # 这种访问方法虽然不会报错,但会发出警告,因为编译器不知道你要进行的是显式访问还是隐式访问
print(s['a'])
print(s['a':'c'])
print(s[s < 3])
高级用法
import pandas as pd
# 创建Series
data = pd.Series([10, 20, 30, 40, 50, 60], index=['a', 'b', 'c', 'd', 'e', 'f'], name='example')
# 访问属性
print(s.head()) # 默认打印输出 s 的前五个元素
print(s.head(2)) # 打印输出 s 的前 2 个元素
print(s.tail()) # 默认打印输出 s 的后五个元素
print(s.tail(2)) # 打印输出 s 的后 2 个元素
Series的常用方法
常用属性
获取Series的索引:
# 获取索引
index = s.index
print(s.keys()) # 方法
print(s.index) # 属性
获取Series的值(返回NumPy数组):
values = s.values
获取Series的形状:
shape = s.shape
获取Series的属性:
# 获取Series的属性
s.describe()
# 获取元素个数(忽略缺失值)
print(s.count())
判断某个元素是否在数组中:
# 判断某个元素是否在数组中
s.isin([4, 5]) # 判断值为 4和5 的元素是否在数组中
统计方法
计算Series的描述性统计:
print(s.mean()) # 平均值
print(s.sum()) # 总和
print(s.min()) # 最小值
print(s.max()) # 最大值
print(s.std()) # 标准差
print(s.var()) # 方差
print(s.median()) # 中位数
计算非空值的数量:
count = s.count()
计算每个元素的数量:
# 每个元素的计数
print(s.value_counts())
缺失值处理
检查缺失值:
# 判断元素是否为缺失值
方法一:
print(s.isnull())
方法二:
print(s.isna())
填充缺失值:
s = s.fillna(0)
删除缺失值:
s = s.dropna()
排序
按值排序:
s = s.sort_values() # 默认为升序排序
s.sort_values(ascending=False) # ascending=False 采用降序排序
print(s.quantile(0.25)) # 分位数
print(s.mode()) # 众数
按索引排序:
s = s.sort_index()
去重
获取唯一值:
方法一:
unique_values = s.unique() # 去重
方法二:
s.drop_duplicates() # 去重
统计值出现的次数:
value_counts = s.value_counts()
print(s.nunique()) # 去重后的元素个数
布尔索引
使用条件筛选数据:
filtered = s[s > 2]
修改索引
重命名索引:
s.index = ['x', 'y', 'z']
使用rename方法:
s = s.rename({'a': 'x', 'b': 'y'})
类型转换
转换Series的数据类型:
s = s.astype(float)
'''
tolist() 是 pandas 和 numpy 中常用的一个方法,用于将数组或序列转换为 Python 的列表(list)。这个方法在数据分析和科学计算中非常有用,因为它可以方便地将 pandas 或 numpy 的数据结构转换为标准的 Python 数据结构,以便于进一步处理或与其他 Python 库交互。
'''
s = s.tolist()
合并Series
连接多个Series:
s1 = pd.Series([1, 2])
s2 = pd.Series([3, 4])
combined = pd.concat([s1, s2])
生成日期序列
# date_range() 用来生成日期序列, periods=10 表示生成10天的日期序列
date = pd.date_range('2023-01-01', periods=10)
商业分析常用方法
计算每日收益率(当日收盘价/前日收盘价 - 1):
# 计算每日收益率
profit_percent = prices.pct_change()
print(profit_percent)
季度的平均销量:
-
'D':每日 -
'W':每周 -
'M':每月 -
'Q':每季度 -
'Y':每年 -
'H':每小时 -
'T'或'min':每分钟 -
'S':每秒
# 季度的平均销量
sales.resample('Q').mean()
between_time():
# 筛选一段时间内的series
s = hours_sales.between_time('8:00', '22:00')
rolling() 的基本概念
rolling() 是 Pandas 中用于实现滚动窗口计算的核心方法,通常作用于 Series 或 DataFrame。通过指定窗口大小,可以对数据进行移动平均、求和、标准差等统计操作。窗口可以是固定大小或基于时间偏移。
基本语法
DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None)
- window:窗口大小,可以是整数(固定窗口)或时间字符串(如
'3D'表示 3 天)。 - min_periods:窗口内最少需要的非
NaN值数量,默认为window。 - center:是否将窗口标签居中,默认为
False(标签位于窗口右端)。 - win_type:窗口类型(如
'triang'、'gaussian'),用于加权计算。 - on:对指定列进行滚动操作(仅适用于
DataFrame)。 - axis:轴向(
0为行,1为列)。 - closed:窗口边界闭合方式(
'left'、'right'、'both'、'neither')。
常用操作示例
固定窗口计算
import pandas as pd
df = pd.DataFrame({'value': [1, 2, 3, 4, 5]})
# 计算 3 个数据的移动平均
df['rolling_mean'] = df['value'].rolling(window=3).mean()
输出结果:
value rolling_mean
0 1 NaN
1 2 NaN
2 3 2.0
3 4 3.0
4 5 4.0
时间窗口计算
df = pd.DataFrame({
'value': [1, 2, 3, 4, 5],
'date': pd.date_range('2023-01-01', periods=5)
})
# 计算 2 天时间窗口的和
df.set_index('date')['value'].rolling('2D').sum()
自定义聚合函数
# 使用 lambda 函数计算窗口内最大值与最小值的差
df['value'].rolling(3).apply(lambda x: x.max() - x.min())
加权窗口
# 使用高斯加权窗口
df['value'].rolling(window=3, win_type='gaussian').mean(std=0.5)
注意事项
- 默认情况下,窗口计算会忽略
NaN值,可通过min_periods控制最小有效值数量。 - 时间窗口需确保索引为
DatetimeIndex,否则需通过on参数指定时间列。 - 对于高频数据,结合
resample()使用可能更高效。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)