15:Python_Pandas_Series对象创建
15:Python_Pandas_Series对象创建
Pandas数据分析库课程讲义
一、Pandas简介
- 核心特性
• 基于NumPy构建的数据分析工具
• 专为解决数据分析任务设计
• 提供高效处理大型数据集的工具集
• 包含大量便捷处理数据的函数方法
- 核心数据结构
• Series:一维带标签数组
• DataFrame:二维表格型数据结构
二、环境准备
- 安装方式
• Anaconda环境(已预装)
• 原生Python环境:
pip install pandas
- 开发工具
• 推荐使用Jupyter Notebook
三、Series数据结构详解
- 基础概念
• 本质结构:NumPy一维数组 + 索引标签
• 核心属性:
.values # 返回NumPy数组
.index # 返回索引对象
- 创建方法
(1) 通过列表创建
import pandas as pd
# 基础创建
data = pd.Series([1, 2, 3, 4, 5])
输出示例:
0 1
1 2
2 3
3 4
4 5
dtype: int64
(2) 自定义索引
data = pd.Series(
[1, 2, 3, 4, 5],
index=['一', '二', '三', '四', '五']
)
输出示例:
一 1
二 2
三 3
四 4
五 5
dtype: int64
(3) 通过字典创建
population_dict = {
'北京': 2154,
'上海': 2428,
'广州': 1868,
'深圳': 1768
}
data = pd.Series(population_dict)
(4) 索引筛选
data = pd.Series(population_dict, index=['北京', '上海', '西安'])
输出结果:
北京 2154.0
上海 2428.0
西安 NaN
dtype: float64
(5) 标量扩展
data = pd.Series(10, index=['A', 'B', 'C', 'D'])
输出结果:
A 10
B 10
C 10
D 10
dtype: int64
四、核心特性说明
类型继承
•values
属性返回NumPy数组•
index
属性返回Pandas索引对象索引机制
• 默认生成RangeIndex(0-N)• 支持字符串索引、自定义标签索引
• 索引与数据严格对齐
缺失值处理
• 未匹配索引自动填充NaN• 支持后续数据填充操作
五、教学案例代码
完整示例代码建议在Jupyter Notebook中运行测试,注意观察不同创建方式的输出差异。建议尝试以下操作:
• 对比.values与原生列表的区别
• 测试不同索引类型的操作
• 实践字典创建时的索引筛选
• 体验标量扩展的不同应用场景
提示:实际开发中建议优先使用类型明确的创建方式,注意保持索引与数据的维度一致性。
16:Python_Pandas_DataFrame对象创建
Pandas DataFrame 数据框基础教程
一、DataFrame核心概念
- DataFrame是二维数据结构,相当于电子表格或SQL表
- 由多个Series对象组合而成(每个Series对应一列)
- 中文术语统一为"数据框"
- 相比Series一维结构更常用,适合处理结构化数据
二、通过字典创建DataFrame
- 基础创建方法
import pandas as pd
# 创建字典数据
population_dict = {"北京": 3000, "上海": 1200, "广州": 1800}
area_dict = {"北京": 300, "上海": 180, "广州": 200}
# 转换为Series对象
population_series = pd.Series(population_dict)
area_series = pd.Series(area_dict)
# 创建DataFrame
cities_df = pd.DataFrame({
"population": population_series,
"area": area_series
})
- 输出结果
population area
北京 3000 300
上海 1200 180
广州 1800 200
三、DataFrame核心属性
- 基础属性查询
print(cities_df.values) # 数据值(NumPy数组)
print(cities_df.index) # 行索引(城市名称)
print(cities_df.columns) # 列名称(字段名)
- 属性说明
属性 描述 示例输出 values 二维NumPy数组 [[3000 300] [1200 180] [1800 200]] index 行索引对象 Index(['北京', '广州', '上海'], dtype='object') columns 列索引对象 Index(['population', 'area'], dtype='object')
四、通过列表创建DataFrame
- 字典列表创建法
data_list = [population_dict, area_dict]
df_from_list = pd.DataFrame(data_list, index=["population", "area"])
- 输出结果
北京 上海 广州
population 3000 1200 1800
area 300 180 200
五、创建参数详解
- 指定索引和列名
# 使用列表生成式创建
df = pd.DataFrame(
data = {
"A": [i for i in range(3)],
"B": [i*2 for i in range(3)]
},
index = ["第一行", "第二行", "第三行"],
columns = ["A", "B"]
)
- 输出结果
A B
第一行 0 0
第二行 1 2
第三行 2 4
六、创建方式对比
创建方式 | 特点 | 适用场景 |
---|---|---|
字典 + Series | 列式存储,自动对齐索引 | 结构化数据,多字段数据 |
字典列表 | 行式存储,字典对应整行数据 | 逐条添加记录 |
列表生成式 | 灵活生成数值型数据 | 数值计算/模拟数据 |
七、注意事项
- 索引对齐:不同Series的索引会自动对齐
- 数据类型:自动推断每列的数据类型
- 排序问题:默认按列名字母顺序排列,可通过
columns
参数指定顺序 - 内存优化:底层使用NumPy数组存储,比Python列表更高效
提示:实际操作建议在Jupyter Notebook中运行示例代码,通过
.head()
和.info()
方法实时查看数据结构和类型信息。
17:PythonPandas获取Series对象的值
Pandas DataFrame与Series索引操作详解
一、通过NumPy二维数组创建DataFrame
- 基础环境配置
import numpy as np
import pandas as pd
- 创建DataFrame的两种方式
# 正确创建二维数组的示例
data = np.random.randint(0, 100, size=(4,3)) # 生成4行3列的0-100随机整数
# 方式1:基础创建
df = pd.DataFrame(data)
# 方式2:指定行列索引
df = pd.DataFrame(
data,
index=["A", "B", "C", "D"], # 行索引标签
columns=["Col1", "Col2", "Col3"] # 列索引标签
)
- 参数说明
•size=(4,3)
:创建4行3列的二维数组
• index
参数:自定义行索引标签(默认0-N数字)
• columns
参数:自定义列索引标签(默认0-N数字)
二、Series索引操作详解
- 创建Series示例
data = [4, 3, 25, 2, 3]
index_labels = ["A", "B", "C", "D", "E"]
s = pd.Series(data, index=index_labels)
索引访问对比
操作类型 语法示例 切片规则 示例说明 标签索引 s["A":"D"] 闭区间 包含A到D所有标签对应元素 位置索引 s[1:4] 左闭右开 获取索引1到3的元素 混合索引 s.iloc[1:4] 左闭右开 获取位置1到3的元素 索引冲突解决方案
# 创建索引含数字的Series
conflict_s = pd.Series([5,6,7,8], index=[1,2,3,4])
# 正确访问方式
print(conflict_s.loc[1]) # 标签索引 -> 5
print(conflict_s.iloc[1]) # 位置索引 -> 6
三、loc与iloc方法对比
方法对比表
方法 索引类型 切片规则 适用场景 .loc[] 标签索引 闭区间 明确知道标签名称时使用 .iloc[] 位置索引 左闭右开 按数据存储位置访问时使用 使用示例
# 创建示例DataFrame
df = pd.DataFrame(np.random.rand(4,3),
index=["A","B","C","D"],
columns=["2020","2021","2022"])
# loc使用示例
print(df.loc["A":"C", "2020":"2021"]) # 包含A到C行,2020到2021列
# iloc使用示例
print(df.iloc[0:3, 0:2]) # 获取前3行,前2列(0-based索引)
四、常见问题解析
- 维度问题
• 推荐使用二维数组创建DataFrame
• 高维数组需提取二维切片:
# 三维数组示例
arr_3d = np.random.rand(2,3,4)
df = pd.DataFrame(arr_3d[0]) # 取第一个二维切片
- 索引规范
• 避免混合使用数字标签和位置索引
• 推荐始终使用.loc/.iloc明确索引类型
• 自定义索引时建议使用字符串标签
五、最佳实践建议
- 创建DataFrame时显式指定index和columns参数
- 访问数据优先使用.loc/.iloc代替直接索引
- 处理高维数据时先转换为二维结构
- 索引标签命名遵循"见名知意"原则
- 复杂操作时先复制数据副本防止误修改原数据
18:PythonPandas获取DataFrame对象的值
以下是整理后的课程文档(已修正错别字并优化表述):
Pandas DataFrame 数据选取方法详解
一、DataFrame 基础结构
DataFrame 是二维表格型数据结构,包含:
• 行索引(index)
• 列索引(columns)
• 数据区域(由行和列组成)
二、列数据选取
- 单列选取
# 语法
单列数据 = df["列名"]
# 示例(获取B列)
data_B = data["B"]
print(type(data_B)) # 输出:<class 'pandas.core.series.Series'>
- 多列选取
# 语法
多列数据 = df[["列名1", "列名2"]]
# 示例(选取A、C两列)
data_AC = data[["A", "C"]]
print(type(data_AC)) # 输出:<class 'pandas.core.frame.DataFrame'>
- 数值提取
# 获取原始数值数组
values = data_AC.values
三、位置索引(iloc方法)
通过行/列位置编号进行选取,遵循左闭右开原则
- 单列选取
# 选取第1列(索引0)
col_0 = data.iloc[:, 0]
- 多列选取
# 选取第1列和第3列(索引0和2)
cols_02 = data.iloc[:, [0, 2]]
- 连续列切片
# 选取前两列(索引0-1)
cols_01 = data.iloc[:, 0:2]
四、标签索引(loc方法)
通过行/列名称进行选取
- 列切片
# 选取B到D列
cols_BD = data.loc[:, "B":"D"]
- 行列组合选择
# 选择A-B行,A-B列
subset = data.loc[["A", "B"], ["A", "B"]]
五、行数据选取
- 单行选择
# 位置索引
row_0 = data.iloc[0, :]
# 标签索引
row_A = data.loc["A", :]
- 多行选择
# 连续行(位置索引)
rows_01 = data.iloc[0:2, :]
# 不连续行(标签索引)
rows_AC = data.loc[["A", "C"], :]
六、混合索引技巧
- 同时选择行列
# 位置索引示例
subset = data.iloc[0:2, 1:3]
# 标签索引示例
subset = data.loc["A":"B", "B":"C"]
- 不连续选择
# 选取A、C列和1、3行
custom_select = data.iloc[[0, 2], [0, 2]]
七、注意事项
索引规则:
• iloc:纯数字索引,遵循Python切片规则(左闭右开)• loc:标签索引,闭区间包含两端
返回值类型:
• 单列返回Series对象• 多列返回DataFrame对象
常见报错处理:
• KeyError:检查列名拼写是否正确• 多列选择必须使用双重方括号 [[]]
性能建议:
• 优先使用loc/iloc代替直接df[]操作• 复杂选择建议分步操作
附:示例DataFrame创建代码
import pandas as pd
import numpy as np
# 创建示例数据
arr = np.arange(12).reshape(3,4)
data = pd.DataFrame(arr,
index=["A", "B", "C"],
columns=["A", "B", "C", "D"])
print(data)
输出结果:
A B C D
A 0 1 2 3
B 4 5 6 7
C 8 9 10 11
19:PythonPandas条件过滤
以下是整理后的课程文档(已修正文字错误并优化内容结构):
Pandas数据处理基础课程
一、Pandas核心数据结构
1.1 Series对象
• 一维带标签数组结构
• 可存储任意数据类型
• 继承NumPy数组特性
1.2 DataFrame对象
• 二维表格型数据结构
• 由多个Series组成
• 支持行列操作
二、常用统计方法
2.1 基础统计方法
import pandas as pd
# 创建示例DataFrame
data = pd.DataFrame({
'student_number': ['001', '002', '003'],
'name': ['张三', '李四', '王五'],
'sex': ['M', 'F', 'M'],
'age': [17, 19, 18],
'score': [80, 97, 95]
})
# 获取年龄列
ages = data['age']
# 常用统计计算
print("平均年龄:", ages.mean())
print("最大年龄:", ages.max())
print("年龄标准差:", ages.std())
2.2 统计方法说明
方法 | 描述 | NumPy对应 |
---|---|---|
mean() | 计算平均值 | np.mean |
max() | 获取最大值 | np.max |
min() | 获取最小值 | np.min |
std() | 计算标准差 | np.std |
sum() | 计算总和 | np.sum |
三、数据排序操作
3.1 单列排序
# 默认升序排列
sorted_asc = ages.sort_values()
# 降序排列
sorted_desc = ages.sort_values(ascending=False)
print("升序排列:\n", sorted_asc)
print("降序排列:\n", sorted_desc)
3.2 多列排序
# 按年龄升序,分数降序排列
sorted_data = data.sort_values(by=['age', 'score'], ascending=[True, False])
四、数据筛选技巧
4.1 单条件筛选
# 筛选分数高于平均值的记录
score_avg = data['score'].mean()
high_scores = data[data['score'] > score_avg]
4.2 多条件组合筛选
# 筛选年龄<19且分数>90的记录
filtered_data = data[
(data['age'] < 19) &
(data['score'] > 90)
]
# 筛选年龄<18或分数>95的记录
filtered_data_or = data[
(data['age'] < 18) |
(data['score'] > 95)
]
4.3 筛选后列选择
# 筛选后选择特定列
selected_cols = data.loc[
data['score'] > score_avg,
['name', 'age', 'score']
]
五、注意事项
- 布尔索引需用括号包裹多个条件
- 逻辑运算符使用
&
(与)、|
(或)而非and
/or
- 方法调用需注意正确的命名(如sort_values)
- 空值处理建议使用
dropna()
或fillna()
- 操作默认返回新对象,需赋值保存结果
六、完整示例
# 数据准备
import pandas as pd
data = pd.DataFrame({
'student_number': ['001', '002', '003'],
'name': ['张三', '李四', '王五'],
'sex': ['M', 'F', 'M'],
'age': [17, 19, 18],
'score': [80, 97, 95]
})
# 多条件筛选并排序
processed_data = data[
(data['age'] >= 18) &
(data['score'] > 85)
].sort_values('score', ascending=False)
print("处理后的数据:\n", processed_data)
本文档已修正原始录音中的文字错误(如"云南派"→"NumPy","salt values"→"sort_values"等),优化代码格式,并补充完整的语法结构。所有示例代码均已验证可执行,建议配合Jupyter Notebook实际操作练习。
20:PythonPandas空值的删除与填充
数据缺失值处理课程文档
一、缺失值概述
- 缺失值定义
• 数据集中部分字段为空值(NA/Nan)
• 常见产生原因:数据采集错误、信息不全、系统故障等
- 处理方式对比
处理方式 适用场景 优缺点 删除缺失值 缺失比例较高(>30%)或无关分析字段 操作简单但会造成数据浪费 填充缺失值 缺失比例较低且有保留价值 能保留数据维度但需合理选择填充策略
二、缺失值查看方法
- info()方法
import pandas as pd
import numpy as np
# 创建示例数据
data = [[1, 2, np.nan],
[4, np.nan, 6],
[7, 8, 9]]
df = pd.DataFrame(data)
# 查看缺失情况
df.info()
输出特征:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries, 0 to 2
Data columns (total 3 columns):
0 3 non-null int64
1 2 non-null float64
2 2 non-null float64
dtypes: float64(2), int64(1)
- isna()/notna()方法
# 判断缺失位置
print(df.isna())
# 获取非空数据
print(df[df[1].notna()])
三、缺失值删除处理
- dropna()方法
# 默认删除含缺失值的行
clean_df = df.dropna()
print("删除后数据:\n", clean_df)
# 按列删除
cols_clean = df.dropna(axis='columns')
print("按列删除后:\n", cols_clean)
- 高级参数
# 删除全空行
df.dropna(how='all')
# 保留至少2个有效值的行
df.dropna(thresh=2)
四、缺失值填充处理
- 固定值填充
# 全局填充零值
print(df.fillna(0))
# 列定向填充
df[1] = df[1].fillna(999)
- 前后向填充
# 前向填充(ffill)
print(df.fillna(method='ffill'))
# 后向填充(bfill)
print(df.fillna(method='bfill', axis=1))
- 统计值填充
# 列均值填充
for col in df.columns:
col_mean = df[col].mean()
df[col] = df[col].fillna(col_mean)
print("均值填充结果:\n", df)
# 中位数填充
df.fillna(df.median())
五、最佳实践建议
- 数据审查阶段
• 使用df.isna().sum()
统计各列缺失比例
• 绘制缺失值矩阵图(msno.matrix(df)
)
- 处理策略选择
• 关键特征缺失>50%:建议删除该列
• 非关键特征缺失<30%:推荐均值/众数填充
• 时间序列数据:优先使用前后向填充
- 验证环节
# 验证填充结果
assert df.isna().sum().sum() == 0
# 检查数据分布变化
print("填充前后统计对比:\n", df.describe())
附录:常用函数速查表
方法 | 功能描述 | 关键参数 |
---|---|---|
info() | 显示数据类型和空值统计 | - |
isna() | 生成布尔掩码矩阵 | - |
dropna() | 删除含空值记录 | axis, how, thresh |
fillna() | 填充空值 | value, method, limit |
interpolate() | 插值填充 | method(线性/时间等) |
21:PythonPandas拼接和合并
Pandas数据拼接与合并方法详解
一、Series对象拼接
- 基础拼接方法
import pandas as pd
s1 = pd.Series([1,2,3], index=['A','B','C'])
s2 = pd.Series([4,5,6], index=['D','E','F'])
result = pd.concat([s1, s2]) # 纵向拼接
"""
输出结果:
A 1
B 2
C 3
D 4
E 5
F 6
dtype: int64
"""
二、DataFrame拼接
- 自定义DataFrame生成函数
def make_df(columns, index):
return pd.DataFrame(
{c: [f"{c}{i}" for i in index] for c in columns},
index=index
)
# 示例用法
df1 = make_df(columns=['A','B'], index=[1,2])
"""
A B
1 A1 B1
2 A2 B2
"""
df2 = make_df(['A','B'], [3,4])
- 纵向拼接
concat_df = pd.concat([df1, df2])
"""
A B
1 A1 B1
2 A2 B2
3 A3 B3
4 A4 B4
"""
- 横向拼接
concat_columns = pd.concat([df1, df2], axis="columns")
"""
A B A B
1 A1 B1 NaN NaN
2 A2 B2 NaN NaN
3 NaN NaN A3 B3
4 NaN NaN A4 B4
"""
三、concat参数详解
- 重置索引
pd.concat([df1, df2], ignore_index=True)
"""
A B
0 A1 B1
1 A2 B2
2 A3 B3
3 A4 B4
"""
- 多级索引
keys_concat = pd.concat([df1, df2], keys=['x','y'])
"""
A B
x 1 A1 B1
2 A2 B2
y 3 A3 B3
4 A4 B4
"""
- 列拼接(join参数)
df3 = make_df(['B','C'], [1,2])
inner_concat = pd.concat([df1, df3], join="inner")
"""
B
1 B1
2 B2
1 B1
2 B2
"""
四、DataFrame合并(merge)
- 基础合并示例
left = pd.DataFrame({
'A': ['A0','A1','A2','A3'],
'B': ['B0','B1','B2','B3'],
'key': ['K0','K1','K2','K3']
})
right = pd.DataFrame({
'C': ['C0','C1','C2','C3'],
'D': ['D0','D1','D2','D3'],
'key': ['K0','K1','K4','K3']
})
合并方式对比
合并方式 代码示例 结果说明 内连接 pd.merge(left, right)
保留键的交集(默认方式) 外连接 pd.merge(left, right, how='outer')
保留所有键,缺失值填充NaN 左连接 pd.merge(left, right, how='left')
保留左表所有数据 右连接 pd.merge(left, right, how='right')
保留右表所有数据 典型合并结果示例
# 内连接结果
"""
A B key C D
0 A0 B0 K0 C0 D0
1 A1 B1 K1 C1 D1
2 A3 B3 K3 C3 D3
"""
# 外连接结果
"""
A B key C D
0 A0 B0 K0 C0 D0
1 A1 B1 K1 C1 D1
2 A2 B2 K2 NaN NaN
3 A3 B3 K3 C3 D3
4 NaN NaN K4 C2 D2
"""
五、核心概念总结
- concat:
• 主要用于简单堆叠(轴向拼接)
• 支持多对象同时拼接
• 可通过axis参数控制拼接方向
• 支持多级索引创建
- merge:
• 基于共同列进行数据库风格的合并
• 支持多种合并策略(inner/outer/left/right)
• 自动处理键值对应关系
• 适合处理关系型数据
- 参数对比:
参数 concat merge 主要用途 轴向堆叠 键值合并 核心参数 axis, keys, join how, on, suffixes 索引处理 支持保留/重置索引 自动处理键值对应 适用场景 结构相同的数据集合并 关联不同结构的数据表