python函数to_dict使用

本文介绍了 Pandas 中 to_dict 函数的多种使用方法及应用场景,包括如何将 DataFrame 转换为不同形式的字典,以及如何利用这些转换后的字典进行列值匹配等实用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

to_dict函数是将数据框数据转换为字典形式。

DataFrame.to_dict(*self*,orient='dict',into=)

都是转换为字典,但具体形式不同:
orient='dict',默认,字典套字典:{column:{index:value}}
orient ='list' ,字典里面为列表:{column:[values]}
orient ='series',字典里为series形式:{column: Series(values)}
orient ='split',字典里是数据对应列表:{'index':[index],'columns':[columns],'data': [values]}
orient ='records',转化后是 list形式:[{column: value},...,{column:value}]
orient ='index',字典里面同样有字典:{index:{column:value}}

具体在应用中,比如将数据框数据转换为字典形式后,进行列值匹配。

1. 使用to_dict函数转换

数据:

Cate_name=pd.read_excel('cate_name.xlsx')
Cate_name

在这里插入图片描述
(这个数据很简单,也可以自己构造)

1.1各种转化形式

Cate_name.to_dict('dict')
转化后:
{'cate': {0: 'A', 1: 'B', 2: 'C', 3: 'D', 4: 'E', 5: 'F', 6: 'G'},
 'cate_name': {0: '红色', 1: '橙色', 2: '黄色', 3: '绿色', 4: '青色', 5: '蓝色', 6: '紫色'}}
Cate_name.to_dict('dict')
转化后:
{'cate': ['A', 'B', 'C', 'D', 'E', 'F', 'G'],
 'cate_name': ['红色', '橙色', '黄色', '绿色', '青色', '蓝色', '紫色']}
Cate_name.to_dict('series')
转化后:
{'cate': 0    A
 1    B
 2    C
 3    D
 4    E
 5    F
 6    G
 Name: cate, dtype: object,
 'cate_name': 0    红色
 1    橙色
 2    黄色
 3    绿色
 4    青色
 5    蓝色
 6    紫色
 Name: cate_name, dtype: object}
Cate_name.to_dict('split')
转化后:
{'index': [0, 1, 2, 3, 4, 5, 6],
 'columns': ['cate', 'cate_name'],
 'data': [['A', '红色'],
  ['B', '橙色'],
  ['C', '黄色'],
  ['D', '绿色'],
  ['E', '青色'],
  ['F', '蓝色'],
  ['G', '紫色']]}
Cate_name.to_dict('records')
转化后:
[{'cate': 'A', 'cate_name': '红色'},
 {'cate': 'B', 'cate_name': '橙色'},
 {'cate': 'C', 'cate_name': '黄色'},
 {'cate': 'D', 'cate_name': '绿色'},
 {'cate': 'E', 'cate_name': '青色'},
 {'cate': 'F', 'cate_name': '蓝色'},
 {'cate': 'G', 'cate_name': '紫色'}]
Cate_name.to_dict('index')
转化后:
{0: {'cate': 'A', 'cate_name': '红色'},
 1: {'cate': 'B', 'cate_name': '橙色'},
 2: {'cate': 'C', 'cate_name': '黄色'},
 3: {'cate': 'D', 'cate_name': '绿色'},
 4: {'cate': 'E', 'cate_name': '青色'},
 5: {'cate': 'F', 'cate_name': '蓝色'},
 6: {'cate': 'G', 'cate_name': '紫色'}}

2. 在列值匹配中的应用

首先这里构造一个数据

import pandas as pd
import numpy as np

cate=np.repeat(['A','B','C','D','E','F','G'],10)
number1=np.random.randn(70)     #符合正态分布的50个数
number2=np.random.randint(70,size=(70,))   #范围在0-50的50个整数

df_tmp=pd.DataFrame({'cate':cate,
             'Num1':number1,
             'Num2':number2})
print(df_tmp.shape)
df_tmp.head()

在这里插入图片描述
我们想要对cate列匹配中文名称,常用的是map函数:

2.1 merge函数列值匹配

Merge_df=pd.merge(df_tmp,Cate_name,on='cate',how='left')
print(Merge_df.shape)
Merge_df.head()

在这里插入图片描述

2.2 使用map函数匹配

下面是使用to_dict函数将数据框进行转化,使用map函数进行匹配
先将数据框转化为字典形式:

cate_split=Cate_name.to_dict('split')
cate_split['data']

输出:

[['A', '红色'],
 ['B', '橙色'],
 ['C', '黄色'],
 ['D', '绿色'],
 ['E', '青色'],
 ['F', '蓝色'],
 ['G', '紫色']]

将上述列表数据保存为字典:

cate_dict=dict()
for pair in cate_split['data']:
    key_v=pair[0]
    cate_dict[key_v]=pair[1]
cate_dict

输出:

{'A': '红色', 'B': '橙色', 'C': '黄色', 'D': '绿色', 'E': '青色', 'F': '蓝色', 'G': '紫色'}

进行匹配:

Merge_df['cate_name2']=Merge_df['cate'].map(cate_dict)
print(Merge_df.shape)
Merge_df.head()

在这里插入图片描述
同样可以匹配。


3. 检验两列值是否相同的小操作

这里插播一个数据框小操作,在上面的场景中,我们用两种方式匹配了中文名称,怎么知道匹配上的两列数值是一样的(cate_name和cate_name2),在数据量较大的情况下,一个个看是不可能的,这里有个小操作可以用。

就是利用布尔值

Merge_df['cate_name']==Merge_df['cate_name2']

在这里插入图片描述
会输出这两列数据,每一对是否相同,因为布尔值为True值可以求和。已知数据是70条,只要求和=70,说明都相同。

(Merge_df['cate_name']==Merge_df['cate_name2']).sum()

输出:
70

3.1 验证一下

上面的数据是都相同的情况,那如果两列值有不相同的值,并且我们想找出是哪些值不同,如何操作?

先构造上不同的数据:

test_df=Merge_df.copy()
data_sol=pd.DataFrame({'cate':['A','B','A'],'Num1':[0.1,0.2,0.1],
          'Num2':[17,18,19],'cate_name':['红色','橙色','无色'],
          'cate_name2':['蓝色','绿色','红色']})
test_df=test_df.append(data_sol).reset_index()
print(test_df.shape)
test_df.tail()

在这里插入图片描述
(添加了三行数据,列值不相同)
查看列值相同的情况有多少行:

#查看每一行数字是否相同
val=test_df['cate_name']==test_df['cate_name2']
val.sum()

输出:
70
查看两列数据,有几个不一样:

len(test_df['cate_name'].unique())-len(test_df['cate_name2'].unique())

输出:
1
(但这个没什么参考意义,因为计算的是其唯一值,如果上述结果是0,不能说明两列值的每一对都是相同的)
查看具体是哪些值不一样:

test_df['cate_name'][~val]

输出:

70    红色
71    橙色
72    无色
Name: cate_name, dtype: object

可以看到,是最后三行列值不同。

查看其index,并输出数据:

val_index=test_df['cate_name'][~val].index
val_index

输出:
Int64Index([0, 1, 2], dtype=‘int64’)

test_df[test_df.index.isin(val_index)]

在这里插入图片描述
这里就可以看到是哪些行的列值不同了。

### 创建自定义类并实现 `to_dict` 方法 为了创建一个能够将其实例转换为字典形式的自定义类,在 Python 中可以通过多种方式实现这一目标。一种常见的方式是在类内部定义一个名为 `to_dict` 的方法,该方法返回表示对象状态的一个字典。 #### 使用内置属性 `__dict__` Python 类实例拥有一个特殊的属性 `__dict__` ,它存储着实例的所有可变属性及其对应的值。可以利用这一点快速构建 `to_dict` 方法[^2]: ```python class Person: def __init__(self, name, age): self.name = name self.age = age def to_dict(self): return self.__dict__ ``` 这种方法简单直接,适用于大多数情况下不需要额外处理的情况。 #### 手动指定要包含的字段 如果希望更精确地控制哪些数据应该被包含在最终生成的字典中,则可以选择手动组装这个字典而不是依赖于 `__dict__` 。这允许排除某些敏感信息或仅导出特定的数据成员。 ```python class Employee: def __init__(self, id, first_name, last_name, salary): self.id = id self.first_name = first_name self.last_name = last_name self.salary = salary def to_dict(self): employee_data = { "id": self.id, "full_name": f"{self.first_name} {self.last_name}", "salary": str(self.salary) + "$" } return employee_data ``` 在这个例子中,不仅选择了部分原始属性作为键值对加入到新字典里,还进行了简单的格式化操作以增强输出效果。 #### 结合外部库(如 Peewee ORM) 对于那些基于数据库模型设计的应用程序来说,可能已经存在一些辅助工具可以帮助完成这项工作。例如Peewee ORM提供了 `model_to_dict()` 函数用于将模型实体转化为字典结构[^4]: 假设有一个继承自 peewee.Model 的 User 表示用户表单中的条目: ```python from peewee import Model, CharField, IntegerField class User(Model): username = CharField() password_hash = CharField() # 敏感信息不对外公开 email = CharField(unique=True) def user_to_safe_dict(user_model): safe_user_info = model_to_dict( user_model, only=[User.username, User.email], exclude=[User.password_hash] ) return safe_user_info ``` 这里通过设置 `only` 和 `exclude` 参数指定了哪些字段应当出现在结果集中以及哪些不应该出现。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值