杰瑞科技汇

Python 字典 dataframe

核心思想

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

Python 字典 dataframe-图1
(图片来源网络,侵删)

将字典 转换为 DataFrame

这是最常见的操作,通常当你有一组结构化的数据,但尚未放入表格中时,会使用这种方式。

字典的“键”是列名,“值”是列数据

这是最直接、最标准的转换方式,字典的键将成为 DataFrame 的列名,字典的值(需要是列表或数组)将成为对应列的数据。

示例代码:

import pandas as pd
# 1. 准备一个字典
# 键是列名,值是包含该列所有数据的列表
data = {
    '姓名': ['张三', '李四', '王五', '赵六'],
    '年龄': [25, 30, 28, 35],
    '城市': ['北京', '上海', '广州', '深圳']
}
# 2. 使用 pd.DataFrame() 函数进行转换
df = pd.DataFrame(data)
# 3. 打印结果
print(df)

输出结果:

Python 字典 dataframe-图2
(图片来源网络,侵删)
  姓名  年龄  城市
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  广州

注意:

Python 字典 dataframe-图3
(图片来源网络,侵删)
  • 使用 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 进行数据清洗、转换和分析的第一步,也是最重要的一步。

分享:
扫描分享到社交APP
上一篇
下一篇