pin_drop当前位置:知识文库 ❯ 图文

pandas DataFrame创建 - 二维数据结构全解析

一、DataFrame概述

DataFrame 是 pandas 中最核心、最常用的二维数据结构,类似于 Excel 表格或 SQL 数据库表。它由行索引、列索引和二维数据组成,每列可以是不同的数据类型。

DataFrame 可以看作是由多个 Series 组成的字典,每个 Series 代表一列,共享同一个行索引。它是数据分析、数据清洗、数据转换的主要操作对象。


二、创建DataFrame的多种方式

1. 从字典列表创建

最常见的创建方式,每个字典代表一行数据。

代码示例

import pandas as pd

# 从字典列表创建
data = [
    {'姓名': '张三', '年龄': 25, '城市': '北京'},
    {'姓名': '李四', '年龄': 30, '城市': '上海'},
    {'姓名': '王五', '年龄': 28, '城市': '广州'}
]
df1 = pd.DataFrame(data)
print(df1)
#    姓名  年龄  城市
# 0  张三  25  北京
# 1  李四  30  上海
# 2  王五  28  广州

2. 从字典(列式)创建

每个键代表列名,对应的值是该列的数据列表。

代码示例

# 从列式字典创建
data = {
    '姓名': ['张三', '李四', '王五', '赵六'],
    '年龄': [25, 30, 28, 35],
    '城市': ['北京', '上海', '广州', '深圳'],
    '薪资': [15000, 20000, 18000, 25000]
}
df2 = pd.DataFrame(data)
print(df2)
#    姓名  年龄  城市     薪资
# 0  张三  25  北京  15000
# 1  李四  30  上海  20000
# 2  王五  28  广州  18000
# 3  赵六  35  深圳  25000

3. 从二维列表/数组创建

代码示例

import numpy as np

# 从二维列表创建
data = [
    ['张三', 25, '北京'],
    ['李四', 30, '上海'],
    ['王五', 28, '广州']
]
df3 = pd.DataFrame(data, columns=['姓名', '年龄', '城市'])
print(df3)

# 从NumPy数组创建
arr = np.random.randn(4, 3)
df4 = pd.DataFrame(arr, 
                   index=['A', 'B', 'C', 'D'],
                   columns=['X', 'Y', 'Z'])
print(df4)

4. 从Series字典创建

代码示例

# 从Series字典创建
df5 = pd.DataFrame({
    '姓名': pd.Series(['张三', '李四', '王五']),
    '年龄': pd.Series([25, 30, 28]),
    '城市': pd.Series(['北京', '上海', '广州'])
})
print(df5)

5. 从文件读取

代码示例

# 从CSV文件读取
df_csv = pd.read_csv('data.csv')

# 从Excel文件读取
df_excel = pd.read_excel('data.xlsx', sheet_name='Sheet1')

# 从JSON文件读取
df_json = pd.read_json('data.json')

# 从SQL数据库读取
import sqlite3
conn = sqlite3.connect('database.db')
df_sql = pd.read_sql('SELECT * FROM users', conn)

三、参数说明

参数 类型 说明
data dict, list, ndarray, DataFrame, Series 数据源,支持多种格式
index Index, array-like 行索引,默认为RangeIndex
columns Index, array-like 列标签,控制列的顺序
dtype dtype, dict 数据类型,可指定整体或每列的类型
copy bool 是否复制数据,默认为False

四、DataFrame的属性和方法

常用属性

  • shape:返回(rows, cols)元组

  • columns:返回列索引

  • index:返回行索引

  • dtypes:返回每列的数据类型

  • values:返回底层二维NumPy数组

  • T:转置DataFrame

常用方法

  • head(n)/tail(n):查看前/后n行

  • info():显示列名、非空值数量、数据类型

  • describe():生成数值列的描述性统计

  • copy():创建DataFrame的深拷贝


五、代码示例

示例1:创建员工信息表

代码示例

import pandas as pd
import numpy as np

# 创建员工信息DataFrame
employees = pd.DataFrame({
    '工号': ['E001', 'E002', 'E003', 'E004', 'E005'],
    '姓名': ['张三', '李四', '王五', '赵六', '钱七'],
    '部门': ['技术部', '市场部', '技术部', '人事部', '财务部'],
    '职位': ['工程师', '经理', '高级工程师', '专员', '主管'],
    '薪资': [15000, 18000, 22000, 10000, 16000],
    '入职日期': pd.to_datetime(['2020-03-15', '2019-07-01', '2018-05-20', 
                                 '2021-11-10', '2020-09-05'])
})

print("=== 员工信息表 ===")
print(employees)
print(f"\n形状: {employees.shape}")
print(f"列名: {employees.columns.tolist()}")
print(f"数据类型:\n{employees.dtypes}")

输出:

代码示例

=== 员工信息表 ===
     工号  姓名   部门     职位     薪资       入职日期
0  E001  张三  技术部    工程师  15000 2020-03-15
1  E002  李四  市场部     经理  18000 2019-07-01
2  E003  王五  技术部  高级工程师  22000 2018-05-20
3  E004  赵六  人事部     专员  10000 2021-11-10
4  E005  钱七  财务部     主管  16000 2020-09-05

形状: (5, 6)
列名: ['工号', '姓名', '部门', '职位', '薪资', '入职日期']
数据类型:
工号         object
姓名         object
部门         object
职位         object
薪资          int64
入职日期    datetime64[ns]
dtype: object

示例2:DataFrame基本信息查看

代码示例

# 查看前3行
print("=== 前3行 ===")
print(employees.head(3))

# 查看基本信息
print("\n=== 详细信息 ===")
print(employees.info())

# 描述性统计
print("\n=== 数值列统计 ===")
print(employees.describe())

# 缺失值检查
print("\n=== 缺失值统计 ===")
print(employees.isnull().sum())

示例3:创建空DataFrame并逐步填充

代码示例

# 创建空DataFrame并指定列
df = pd.DataFrame(columns=['姓名', '年龄', '城市'])

# 逐行添加数据(不推荐在循环中使用)
df.loc[len(df)] = ['张三', 25, '北京']
df.loc[len(df)] = ['李四', 30, '上海']
df.loc[len(df)] = ['王五', 28, '广州']

print(df)
#    姓名  年龄  城市
# 0  张三  25  北京
# 1  李四  30  上海
# 2  王五  28  广州

# 推荐方式:先收集数据列表,再一次性创建
data_list = []
for i in range(5):
    data_list.append({'姓名': f'用户{i+1}', '年龄': 20+i, '城市': ['北京','上海','广州','深圳','杭州'][i]})
df = pd.DataFrame(data_list)
print(df)

六、实际应用场景

  • 数据导入导出:从CSV/Excel/数据库读取数据,处理后导出结果

  • 数据清洗:处理缺失值、重复值、异常值,统一数据格式

  • 特征工程:创建新特征列、数据转换、编码分类变量

  • 报表生成:汇总统计数据,生成格式化报表


七、注意事项

注意1:避免在循环中使用 df.loc[len(df)] 逐行添加数据,性能很差。推荐先收集数据列表再一次性创建。

注意2:pandas 2.0 已移除 df.append(),请使用 pd.concat() 替代。

注意3:从字典创建DataFrame时,如果字典中的列表长度不一致会抛出 ValueError。确保所有列的数据长度相同。

小贴士

使用 pd.read_csv() 时,可以通过 nrows 参数先读取少量数据查看结构,确认无误后再读取全部数据。


八、DataFrame与Excel对比

特性 pandas DataFrame Excel表格
行数限制 受内存限制,可达千万级 1,048,576行
自动化能力 脚本化,可批量处理 手动操作为主
数据处理速度 向量化运算,速度快 逐行处理,速度较慢
可重复性 代码可重复执行 手动操作难追踪
可视化 需配合Matplotlib等 内置图表功能
学习曲线 需要编程基础 上手简单

九、小结

  • DataFrame 可从字典列表、列式字典、二维数组、Series字典等多种方式创建

  • 支持从 CSV、Excel、JSON、SQL 等多种文件格式直接读取

  • 使用 info() 和 describe() 快速了解数据概况

  • 避免循环逐行添加数据,推荐先收集再批量创建


十、练习题

练习1

创建一个包含5名学生3门课程(语文、数学、英语)成绩的 DataFrame,列包括:学号、姓名、语文、数学、英语。使用 info()describe() 查看数据信息。

练习2

使用 NumPy 的 np.random.randn() 生成一个 4x4 的随机数 DataFrame,行索引为 A-D,列索引为 W-Z。计算每列的均值和标准差。

练习3

对比使用 df.loc[len(df)] 循环添加 10000 行数据与先收集列表再一次性创建 DataFrame 的性能差异(使用 time 模块计时)。

常见问题

从字典创建DataFrame时,字典的键值对长度可以不同吗?

不可以。所有列的数据长度必须一致,否则会抛出 ValueError。如果某个值缺失,应该用 None 或 np.nan 占位。

如何指定DataFrame的列顺序?

在创建时通过 columns 参数指定:pd.DataFrame(data, columns=['列1', '列2', '列3'])。创建后可通过 df = df[['列2', '列1', '列3']] 重新排序。

DataFrame 和 Excel 哪个更适合数据分析?

对于自动化、大批量、可重复的数据分析任务,pandas DataFrame 更合适。对于小规模数据、需要直观查看或与他人共享的场景,Excel 更方便。两者经常配合使用。

如何设置DataFrame的索引?

创建时通过 index 参数指定,或使用 set_index('列名') 将某列设为索引。使用 reset_index() 可将索引恢复为普通列。

标签: DataFrame pandas教程 二维数据 数据创建 数据导入 Python

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: pandas Series创建与操作 - 一维数据结构详解 下一篇: pandas DataFrame选择数据 - loc与iloc详解

poll相关推荐