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 深圳 250003. 从二维列表/数组创建
代码示例
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)三、参数说明
四、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对比
九、小结
-
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() 可将索引恢复为普通列。
本文涉及AI创作
内容由AI创作,请仔细甄别