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:通常为int64float64object
  • shape:如(4,)表示长度为4的一维数据。
  • index:显示索引标签(如Index(['a', 'b', 'c', 'd'], dtype='object'))。
  • values:显示底层NumPy数组(如[10 20 30 40])。
  • name:若未指定则为None
  • size:返回元素数量(如4)。
  • emptyFalse表示非空。
  • nbytes:数据占用的总字节数(如32表示4个8字节整数)。
  • hasnansFalse表示无NaN值。

注意事项

  • 如果数据包含混合类型(如整数和字符串),dtype会返回object
  • 修改values数组可能会直接影响Series的数据(因为返回的是视图而非副本)。
  • 使用lociloc时需确保索引或位置有效,否则会引发KeyErrorIndexError

访问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 中用于实现滚动窗口计算的核心方法,通常作用于 SeriesDataFrame。通过指定窗口大小,可以对数据进行移动平均、求和、标准差等统计操作。窗口可以是固定大小或基于时间偏移。

基本语法
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() 使用可能更高效。
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐