朝花夕拾---------pandas库中DataFrame和Series数据结构的区别
一.核心区别
在 Pandas 中,DataFrame和 Series是两种核心数据结构,它们的核心区别如下:
1. 维度与结构
|
Series |
DataFrame | |
|---|---|---|
|
维度 |
一维(1D) |
二维(2D) |
|
结构 |
带索引的一列数据 |
带行索引和列标签的多列数据 |
|
类比 |
类似 Excel 中的一列 |
类似整个 Excel 表格 |
示例
import pandas as pd
# Series(一维)
s = pd.Series([1, 2, 3], name='A')
print(s)
输出:
0 1
1 2
2 3
Name: A, dtype: int64
# DataFrame(二维)
df = pd.DataFrame({'A': [1, 2, 3], 'B': ['X', 'Y', 'Z']})
print(df)
输出:
A B
0 1 X
1 2 Y
2 3 Z
2. 数据访问方式
|
操作 |
Series |
DataFrame |
|---|---|---|
|
单列访问 |
|
|
|
多列访问 |
不支持(因为只有一列) |
|
|
单元素访问 |
|
|
示例
# Series 操作
print(s[0]) # 输出: 1
print(s.name) # 输出: 'A'
# DataFrame 操作
print(df['A']) # 返回 Series
print(df[['A']]) # 返回 DataFrame(单列)
print(df.at[0, 'A']) # 输出: 1
3. 功能差异
|
功能 |
Series |
DataFrame |
|---|---|---|
|
列名 |
通过 |
通过 |
|
索引 |
通过 |
通过 |
|
数学运算 |
按元素计算(向量化) |
按列或行计算 |
|
缺失值处理 |
|
|
|
统计函数 |
|
|
示例
# Series 统计
print(s.mean()) # 输出: 2.0
# DataFrame 统计
print(df.mean()) # 输出: A列均值(其他列自动忽略非数值列)
4. 相互转换
Series → DataFrame
s_to_df = s.to_frame() # 单列Series转为DataFrame
print(s_to_df)
输出:
A
0 1
1 2
2 3
DataFrame 单列 → Series
df_to_s = df['A'] # 提取单列变为Series
print(df_to_s)
输出:
0 1
1 2
2 3
Name: A, dtype: int64
5. 何时用 Series?何时用 DataFrame?
-
用
Series:-
处理单列数据时(如某一列的计算、绘图)
-
需要一维输出时(如
.value_counts()返回 Series)
-
-
用
DataFrame:-
处理多列结构化数据(如表格)
-
需要行列操作时(如
pivot_table()、groupby())
-
直观对比图
Series(一维) DataFrame(二维)
┌───────┐ ┌───────┬───────┐
│ Index │ │ Index │ Col1 │
├───────┤ ├───────┼───────┤
│ 1 │ │ 0 │ A │
│ 2 │ │ 1 │ B │
│ 3 │ │ 2 │ C │
└───────┘ └───────┴───────┘
总结
-
Series 是带索引的一维数组,适合单列数据。 -
DataFrame 是多个Series的集合(二维表格),适合多列结构化数据。 -
两者可以相互转换,但需注意维度变化对操作的影响。
二.如何选择?
问:如果要把一个表格中的一列数据做处理(归一化或者赋值),该用哪种数据结构?
在 Pandas 中,对表格中的 单列数据进行处理(如归一化或赋值) 时,应根据操作需求选择 Series或 DataFrame:
1. 如果只是对单列进行数学处理(如归一化)
✅ 推荐用 Series(单括号 data['列名'])
-
直接操作列数据,语法简洁。
-
适用于大多数标量运算(如加减乘除、归一化、标准化)。
示例:归一化(Min-Max Scaling)
# 用 Series 操作
data['Amount'] = (data['Amount'] - data['Amount'].min()) / (data['Amount'].max() - data['Amount'].min())
优点:
-
代码简洁,直接对列进行数学运算。
-
无需考虑二维结构,适合单列操作。
2. 如果需要兼容 Scikit-learn 等库(如 StandardScaler)
✅ 推荐用 DataFrame(双括号 data[['列名']])
-
Scikit-learn 的预处理工具(如
StandardScaler、MinMaxScaler)要求输入是二维数据(即使只有一列)。 -
双括号
[['列名']]会返回DataFrame,确保维度匹配。
示例:Z-Score 标准化
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
data[['Amount']] = scaler.fit_transform(data[['Amount']]) # 必须用双括号!
为什么不能用 Series?
# 错误示例:Series 是一维,会报错!
data['Amount'] = scaler.fit_transform(data['Amount']) # ❌ 报错:Expected 2D array, got 1D array
3. 赋值操作时的选择
-
如果右侧结果是
Series或一维数组:用单括号
data['列名']直接赋值。data['Amount'] = new_series # new_series 是 Series 或一维数组 -
如果右侧结果是二维数组(如 Scikit-learn 输出):
用双括号
data[['列名']]保持维度一致。data[['Amount']] = scaler_output # scaler_output 是二维数组 (n_samples, 1)
总结:如何选择?
|
场景 |
推荐数据结构 |
语法 |
原因 |
|---|---|---|---|
|
单列数学运算(如归一化) |
|
|
简洁,直接支持向量化运算 |
|
使用 Scikit-learn 工具 |
|
|
兼容库的二维输入要求 |
|
赋值一维数据 |
|
|
自动适配维度 |
|
赋值二维数据 |
|
|
保持二维结构 |
附加建议
-
保持一致性:如果后续可能扩展为多列操作,优先用
DataFrame。 -
明确维度:不确定时,用
data[['列名']].shape检查维度。 -
灵活转换:
# 将 Series 转为 DataFrame(单列) df_column = data['列名'].to_frame() # 将 DataFrame(单列)转回 Series series = data[['列名']].squeeze()
更多推荐



所有评论(0)