核心思想
DataFrame 是一个二维的、表格型的数据结构,而 字典 是一个键值对的无序集合,它们之间的转换,本质上是将不同结构的数据进行重塑,以适应不同的处理需求。

将字典 转换为 DataFrame
这是最常见的操作,通常当你有一组结构化的数据,但尚未放入表格中时,会使用这种方式。
字典的“键”是列名,“值”是列数据
这是最直接、最标准的转换方式,字典的键将成为 DataFrame 的列名,字典的值(需要是列表或数组)将成为对应列的数据。
示例代码:
import pandas as pd
# 1. 准备一个字典
# 键是列名,值是包含该列所有数据的列表
data = {
'姓名': ['张三', '李四', '王五', '赵六'],
'年龄': [25, 30, 28, 35],
'城市': ['北京', '上海', '广州', '深圳']
}
# 2. 使用 pd.DataFrame() 函数进行转换
df = pd.DataFrame(data)
# 3. 打印结果
print(df)
输出结果:

姓名 年龄 城市
0 张三 25 北京
1 李四 30 上海
2 王五 28 广州
3 赵六 35 深圳
字典的“键”是索引,“值”是行数据
你的数据可能是按行组织的,这时,字典的键会成为 DataFrame 的索引,字典的值(需要是另一个字典)会成为每一行的数据。
示例代码:
import pandas as pd
# 1. 准备一个字典
# 键是行索引,值是另一个字典(包含该行的数据)
data_by_row = {
'row1': {'姓名': '张三', '年龄': 25, '城市': '北京'},
'row2': {'姓名': '李四', '年龄': 30, '城市': '上海'},
'row3': {'姓名': '王五', '年龄': 28, '城市': '广州'}
}
# 2. 使用 pd.DataFrame() 进行转换
df_by_row = pd.DataFrame.from_dict(data_by_row, orient='index')
# 3. 打印结果
print(df_by_row)
输出结果:
姓名 年龄 城市
row1 张三 25 北京
row2 李四 30 上海
row3 王五 28 广州
注意:

- 使用
pd.DataFrame()也可以直接转换,但from_dict提供了orient参数,可以更清晰地指定方向。 orient='index'明确告诉 Pandas,字典的键是行索引。orient='columns'(这是默认值) 的行为和场景一一样。
将 DataFrame 转换为字典
当你需要将表格数据导出,或者传递给不接受 DataFrame 格式的函数时,就需要进行反向转换。
转换为“键为列名,值为列表”的字典
这是最常用的转换方式,与场景一对应。
示例代码:
import pandas as pd
# 1. 准备一个 DataFrame
data = {
'姓名': ['张三', '李四', '王五', '赵六'],
'年龄': [25, 30, 28, 35],
'城市': ['北京', '上海', '广州', '深圳']
}
df = pd.DataFrame(data)
# 2. 使用 .to_dict() 方法进行转换
# to_dict() 默认的 orient='list'
data_dict = df.to_dict()
# 3. 打印结果
print(data_dict)
输出结果:
{'姓名': ['张三', '李四', '王五', '赵六'], '年龄': [25, 30, 28, 35], '城市': ['北京', '上海', '广州', '深圳']}
转换为“键为索引,值为行数据”的字典
这与场景二对应,每一行数据都会被转换成一个字典。
示例代码:
import pandas as pd
# 1. 准备一个 DataFrame
data = {
'姓名': ['张三', '李四', '王五', '赵六'],
'年龄': [25, 30, 28, 35],
'城市': ['北京', '上海', '广州', '深圳']
}
df = pd.DataFrame(data)
# 2. 使用 .to_dict() 方法,并指定 orient='index'
data_dict_by_row = df.to_dict(orient='index')
# 3. 打印结果
print(data_dict_by_row)
输出结果:
{
0: {'姓名': '张三', '年龄': 25, '城市': '北京'},
1: {'姓名': '李四', '年龄': 30, '城市': '上海'},
2: {'姓名': '王五', '年龄': 28, '城市': '广州'},
3: {'姓名': '赵六', '年龄': 35, '城市': '深圳'}
}
其他 orient 参数
to_dict() 方法非常灵活,orient 参数可以指定不同的输出格式:
'dict'(默认):orient='list的别名。'list': 键为列名,值为列表。'series': 键为列名,值为 Pandas Series。'split': 键为'index','columns','data',分别对应索引、列名和数据。df.to_dict(orient='split') # {'index': [0, 1, 2, 3], 'columns': ['姓名', '年龄', '城市'], 'data': [['张三', 25, '北京'], ['李四', 30, '上海'], ['王五', 28, '广州'], ['赵六', 35, '深圳']]}'records': 键为列名,值为每一行数据的列表,JSON API 常用此格式。df.to_dict(orient='records') # [{'姓名': '张三', '年龄': 25, '城市': '北京'}, {'姓名': '李四', '年龄': 30, '城市': '上海'}, ...]'index': 键为索引,值为行数据的字典(如场景二所示)。
实际应用示例
假设你从一个 API 获取了用户数据,格式是字典列表,现在你想将其转换为 DataFrame 进行分析。
示例代码:
import pandas as pd
# 1. 模拟从 API 获取的数据
api_response = [
{'user_id': 101, 'username': 'charlie', 'status': 'active'},
{'user_id': 102, 'username': 'david', 'status': 'inactive'},
{'user_id': 103, 'username': 'eve', 'status': 'active'},
{'user_id': 104, 'username': 'frank', 'status': 'pending'}
]
# 2. 直接将字典列表转换为 DataFrame
# Pandas 会自动将列表中的每个字典视为一行
# 字典的键会成为列名
df_users = pd.DataFrame(api_response)
# 3. 打印 DataFrame
print("用户 DataFrame:")
print(df_users)
# 4. 进行数据分析:计算 'active' 状态的用户数
active_users_count = df_users[df_users['status'] == 'active'].shape[0]
print(f"\n活跃用户数量: {active_users_count}")
# 5. 将处理后的数据导出为字典,以便其他系统使用
# 转换为 'records' 格式,方便前端渲染
export_data = df_users.to_dict(orient='records')
print("\n导出为 'records' 格式的字典:")
print(export_data)
输出结果:
用户 DataFrame:
user_id username status
0 101 charlie active
1 102 david inactive
2 103 eve active
3 104 frank pending
活跃用户数量: 2
导出为 'records' 格式的字典:
[{'user_id': 101, 'username': 'charlie', 'status': 'active'}, {'user_id': 102, 'username': 'david', 'status': 'inactive'}, {'user_id': 103, 'username': 'eve', 'status': 'active'}, {'user_id': 104, 'username': 'frank', 'status': 'pending'}]
总结与对比
| 操作 | 方法/函数 | 说明 | 典型场景 |
|---|---|---|---|
| 字典 → DataFrame | pd.DataFrame(my_dict) |
最常用方式,字典的键作为列名。 | 从原始数据结构创建分析表。 |
pd.DataFrame.from_dict(my_dict, orient='index') |
字典的键作为行索引。 | 数据按行组织,需要转置。 | |
| DataFrame → 字典 | df.to_dict() |
默认 orient='list',键为列名,值为列表。 |
导出数据,或传递给非 Pandas 函数。 |
df.to_dict(orient='index') |
键为索引,值为行数据的字典。 | 需要以行为单位处理数据。 | |
df.to_dict(orient='records') |
键为列名,值为每一行数据的字典列表。 | 序列化数据,与 JSON/前端交互。 |
掌握字典和 DataFrame 之间的转换是使用 Pandas 进行数据清洗、转换和分析的第一步,也是最重要的一步。
