python函数to_dict使用

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)]

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

  • 14
    点赞
  • 98
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值