简道云的群里有人在讨论,如何将excel中的数据处理成简道云子表单的数据类型。Excel的数据大家都熟悉,简道云(帆软2015年推出的无代码应用开发平台)子表单的数据类型为列表中嵌套字典的格式,如下所示
{
"data":
[
{"a":"a1","b":"b1","c":"c1"},
{"a":"a2","b":"b2","c":"c2"},
{"a":"a3","b":"b3","c":"c3"},
{"a":"a4","b":"b4","c":"c4"}
]
}
提问者就是希望能将excel中的数据处理成上面代码中列表中的格式。
方案1
方案1的代码是提问者从网上百度的,具体如下
import pandas as pd
import time
t0 = time.time # 获取起始时间戳
# 读取文件数据
df = pd.read_excel('excel.xlsx')
print(df)
head_list = list(df.columns) # 获取数据的列名称
list_dic = # 创建一个空列表
for i in df.values:
a_line = dict(zip(head_list,i)) # 将每行数据和列名称转换成字典
list_dic.append(a_line) # 将字典追加到列表上
print(list_dic)
print(time.time-t0)
我测试了一个数据大小为(15546行, 26列)的Excel,执行效率如下
方案2
看到上面的代码我想到了作为Python处理数据的翘楚,pandas既然能读取列表嵌套字典型数据那么就可以输出列表嵌套字典型数据。于是搜索之,发现了下面这个方法。
# 读取文件数据
df = pd.read_excel(path)
# 将DataFrame转换成列表字典
df.to_dict('records') # record是将每行记录转换成字典
它的执行效率如下图所示,所耗时间仅为方案1的1/10不到。而且数据处理代码只有一行,相比上面的for循环遍历简直是降维秒杀。
下面是数据处理后的样式
[
{'EFFECT_TIME': '2019-05-17 00:00:01','VALID_TIME': '2019-05-17 00:00:01','ORDERGID': '2DD748F7-37E9-4918-B716-77EA6BFF6197'},
{'EFFECT_TIME': '2019-06-16 00:00:01','VALID_TIME': '2019-06-16 00:00:01','ORDERGID': 'A4D3736F-E961-4CAD-BE2D-54D548ECCCF8'},
{'EFFECT_TIME': '2019-06-16 00:00:01','VALID_TIME': '2019-06-16 00:00:01','ORDERGID': 'C5DAB2E5-51E5-4A17-82DB-0EEF4695406A'}
]
to_dict()方法
DataFrame.to_dict(orient='dict',into=<class 'dict'>)
作用:将DataFrame转换成字典
字典类型可以通过下面的参数来控制
orient:str {'dict','list', 'series','split', 'records','index'}
'dict':默认值。如下,它将每列的值转换成了一个字典,值为字典
{列名:{索引:值 , 索引:值 } , 列名:{索引:值 , 索引:值 }}
{
'EFFECT_TIME': {0: '2019-05-17 00:00:01',1: '2019-06-16 00:00:01',2: '2019-06-16 00:00:01'},
'VALID_TIME': {0: '2019-05-17 00:00:01' ,1: '2019-06-16 00:00:01',2: '2019-06-16 00:00:01'},
'ORDERGID': {0: '2DD748F7-37E9-4918-B716-77EA6BFF6197',1: 'A4D3736F-E961-4CAD-BE2D-54D548ECCCF8',2: 'C5DAB2E5-51E5-4A17-82DB-0EEF4695406A'},
'CFORMCODE': {0: 'D201900068848', 1: 'D201900138112', 2: 'D201900135280'}
}
'list':如下,它将每列的值转换成了一个字典,值为列表
{列名: , 列名: }
{
'EFFECT_TIME': ,
'VALID_TIME': ,
'ORDERGID': ,
'CFORMCODE':
}
'series':如下,
{
'EFFECT_TIME':
0 2019 - 05 - 17 00: 00: 01
1 2019 - 06 - 16 00: 00: 01
2 2019 - 06 - 16 00: 00: 01
Name: EFFECT_TIME, dtype: object,
'VALID_TIME':
0 2019 - 05 - 17 00: 00: 01
1 2019 - 06 - 16 00: 00: 01
2 2019 - 06 - 16 00: 00: 01
Name: VALID_TIME, dtype: object,
'ORDERGID':
0 2 DD748F7 - 37E9 - 4918 - B716 - 77E A6BFF6197
1 A4D3736F - E961 - 4 CAD - BE2D - 54 D548ECCCF8
2 C5DAB2E5 - 51E5 - 4 A17 - 82 DB - 0E EF4695406A
Name: ORDERGID, dtype: object,
'CFORMCODE':
0 D201900068848
1 D201900138112
2 D201900135280
Name: CFORMCODE, dtype: object
}
'split':如下
{index:,columns:,data:}
{
'index': ,
'columns': ,
'data':
[
,
,
]
}
'records':如下,它将DataFrame转换成了一个列表,列表中是每行数据的字典
[
{
'EFFECT_TIME': '2019-05-17 00:00:01',
'VALID_TIME': '2019-05-17 00:00:01',
'ORDERGID': '2DD748F7-37E9-4918-B716-77EA6BFF6197',
'CFORMCODE': 'D201900068848'
},
{
'EFFECT_TIME': '2019-06-16 00:00:01',
'VALID_TIME': '2019-06-16 00:00:01',
'ORDERGID': 'A4D3736F-E961-4CAD-BE2D-54D548ECCCF8',
'CFORMCODE': 'D201900138112'
},
{
'EFFECT_TIME': '2019-06-16 00:00:01',
'VALID_TIME': '2019-06-16 00:00:01',
'ORDERGID': 'C5DAB2E5-51E5-4A17-82DB-0EEF4695406A',
'CFORMCODE': 'D201900135280'
}
]
'index':如下,它将DataFrame转换成
{0:{列1:值,列2:值},1:{列1:值,列2:值},2:{列1:值,列2:值}}
{
0: {
'EFFECT_TIME': '2019-05-17 00:00:01',
'VALID_TIME': '2019-05-17 00:00:01',
'ORDERGID': '2DD748F7-37E9-4918-B716-77EA6BFF6197',
'CFORMCODE': 'D201900068848'
},
1: {
'EFFECT_TIME': '2019-06-16 00:00:01',
'VALID_TIME': '2019-06-16 00:00:01',
'ORDERGID': 'A4D3736F-E961-4CAD-BE2D-54D548ECCCF8',
'CFORMCODE': 'D201900138112'
},
2: {
'EFFECT_TIME': '2019-06-16 00:00:01',
'VALID_TIME': '2019-06-16 00:00:01',
'ORDERGID': 'C5DAB2E5-51E5-4A17-82DB-0EEF4695406A',
'CFORMCODE': 'D201900135280'
}
}
to_dict()与to_json()有异曲同工之妙,而且这俩函数的参数值以及所得结果也很类似,不过to_json()的返回值为json字符串。
有兴趣的可以看看
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_json.html
这个案例让我再次感受到pandas处理数据的简洁和高效
人生苦短,我用python!
编辑于 2021-8-31 13:52 编辑于 2021-8-31 13:52