一.核心区别

在 Pandas 中,DataFrameSeries是两种核心数据结构,它们的核心区别如下:


​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​

​单列访问​

s本身就是一列

df['A']返回 Series

​多列访问​

不支持(因为只有一列)

df[['A', 'B']]返回 DataFrame

​单元素访问​

s[0]

df.at[0, 'A']

​示例​
# 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​

​列名​

通过 s.name访问

通过 df.columns访问

​索引​

通过 s.index访问

通过 df.index访问

​数学运算​

按元素计算(向量化)

按列或行计算

​缺失值处理​

s.isna()

df.isna()

​统计函数​

s.mean(), s.max()

df.mean(), df.max()

​示例​
# 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 中,对表格中的 ​​单列数据进行处理(如归一化或赋值)​​ 时,应根据操作需求选择 SeriesDataFrame


​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 的预处理工具(如 StandardScalerMinMaxScaler)要求输入是二维数据(即使只有一列)。

  • 双括号 [['列名']]会返回 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)

​总结:如何选择?​

​场景​

​推荐数据结构​

​语法​

​原因​

单列数学运算(如归一化)

Series

data['列名']

简洁,直接支持向量化运算

使用 Scikit-learn 工具

DataFrame(二维)

data[['列名']]

兼容库的二维输入要求

赋值一维数据

Series

data['列名'] = ...

自动适配维度

赋值二维数据

DataFrame

data[['列名']] = ...

保持二维结构


​附加建议​

  • ​保持一致性​​:如果后续可能扩展为多列操作,优先用 DataFrame

  • ​明确维度​​:不确定时,用 data[['列名']].shape检查维度。

  • ​灵活转换​​:

    # 将 Series 转为 DataFrame(单列)
    df_column = data['列名'].to_frame()
    
    # 将 DataFrame(单列)转回 Series
    series = data[['列名']].squeeze()
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐