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()
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
讯享网test_df[test_df.index.isin(val_index)]

这里就可以看到是哪些行的列值不同了。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/48410.html