Pandas DataFrame 数据结构

DataFrame 是 Pandas 中最重要的二维表格型数据结构。它由行和列组成,可以看作是由多个 Series 共享同一个索引构成的字典。DataFrame 既支持行索引也支持列索引,是进行数据分析的核心对象。

📌 创建 DataFrame

DataFrame 可以通过多种方式创建,最常用的是通过字典、列表、NumPy 数组,或从外部文件读取。

从字典创建
import pandas as pd

data = {
    '姓名': ['张三', '李四', '王五'],
    '年龄': [25, 30, 28],
    '城市': ['北京', '上海', '广州']
}
df = pd.DataFrame(data)
print(df)

字典的键成为列名,值为列数据。

从列表嵌套创建
data = [['张三', 25, '北京'],
        ['李四', 30, '上海'],
        ['王五', 28, '广州']]
df = pd.DataFrame(data,
                  columns=['姓名','年龄','城市'])
print(df)
从 NumPy 数组创建
import numpy as np

arr = np.array([[1, 2, 3],
                [4, 5, 6],
                [7, 8, 9]])
df = pd.DataFrame(arr,
                  columns=['A','B','C'])
print(df)
从 CSV 文件读取
# 读取同目录下的 data.csv 文件
df = pd.read_csv('data.csv')
print(df.head())

后面章节会详细讲解文件读写。

🔍 查看数据的基本属性和方法

创建 DataFrame 后,可以通过以下属性和方法快速了解数据概况:

.shape (行数,列数) .columns 列名 .index 行索引 .dtypes 每列数据类型 .info() 内存使用和类型 .describe() 数值列统计 .head(n) 前n行 .tail(n) 后n行
# 创建示例 DataFrame
df = pd.DataFrame({
    '姓名': ['张三', '李四', '王五', '赵六'],
    '年龄': [25, 30, 28, 35],
    '工资': [8000, 12000, 9500, 15000]
})

print("形状:", df.shape)
print("列名:", df.columns.tolist())
print("数据类型:\n", df.dtypes)
print("\n前2行:\n", df.head(2))
print("\n描述统计:\n", df.describe())

🎯 数据索引与选择

DataFrame 提供了灵活的数据选择方式,包括列选择、行选择、切片和条件筛选。

📋 列选择

# 选择单列,返回 Series
print(df['姓名'])

# 选择多列,返回 DataFrame
print(df[['姓名', '工资']])

# 使用点号选择(列名必须是有效标识符)
print(df.年龄)

📏 行选择

推荐使用 .loc[] (基于标签) 和 .iloc[] (基于整数位置) 进行行选择。

# 使用 .iloc[] 按位置选择
print(df.iloc[0])       # 第一行
print(df.iloc[1:3])     # 第二到第三行(不含第四行)

# 使用 .loc[] 按标签选择
df.index = ['a', 'b', 'c', 'd']   # 自定义行索引
print(df.loc['b'])       # 行标签为 'b' 的行
print(df.loc['b':'d'])   # 切片包含结束

🎭 混合选择 (行与列)

# 选择第0行,第1列
print(df.iloc[0, 1])    # 输出: 25

# 选择行 'b' 到 'd' 的 '姓名' 和 '工资' 列
print(df.loc['b':'d', ['姓名', '工资']])

🔍 布尔索引

# 筛选年龄大于28的行
print(df[df['年龄'] > 28])

# 多条件筛选(使用 & 表示与,| 表示或)
print(df[(df['年龄'] > 25) & (df['工资'] < 15000)])

⚡ 常用操作

添加/删除列
# 添加新列
df['部门'] = ['销售', '技术', '技术', '管理']

# 删除列
df.drop('部门', axis=1, inplace=True)

# 插入列到指定位置
df.insert(2, '性别', ['男','男','女','男'])
排序
# 按年龄升序
df.sort_values('年龄', inplace=True)

# 按工资降序
df.sort_values('工资', ascending=False, inplace=True)
缺失值处理
# 检查缺失值
df.isna().sum()

# 删除含有缺失值的行
df.dropna(inplace=True)

# 填充缺失值
df.fillna(0, inplace=True)
分组与聚合
# 按部门分组,计算平均工资
df.groupby('部门')['工资'].mean()

🧩 DataFrame 与 Series 的关系

DataFrame 可以看作是 Series 的字典:每一列都是一个 Series,共享相同的行索引。从 DataFrame 中选取一列就得到一个 Series。

# 选取一列返回 Series
age_series = df['年龄']
print(type(age_series))  # 

# 对 Series 进行操作
print(age_series.mean())
数据结构 维度 描述
Series 1维 带标签的一维数组,类似于带索引的列表
DataFrame 2维 表格型数据结构,由多个 Series 共用索引构成
掌握 DataFrame 的基础操作是进行任何数据分析的前提。后续章节将深入讲解数据清洗、聚合、合并、时间序列等高级主题,帮助你成为 Pandas 高手。