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)]
这里就可以看到是哪些行的列值不同了。