相关文章推荐
旅途中的鼠标垫  ·  PEL和平精英职业联赛电竞赛事-PEC赛季比 ...·  3 月前    · 
追风的啤酒  ·  福建莆田过年的特色美食“红团”,味道甜而不腻 ...·  1 年前    · 
温文尔雅的书包  ·  六书指的是什么·  1 年前    · 
奔跑的鸭蛋  ·  《临江仙·夜饮东坡醒复醉》_苏轼的诗词_诗词名句网·  1 年前    · 
狂野的荒野  ·  电影《紧急救援》将于大年初一全国上映-新华网·  1 年前    · 
小百科  ›  原本是list类型,pandas读入后变成str、obejct等其他的类型,恢复成list,并进行数据炸裂explode操作_列表读入dataframe变成str
list pandas
坚强的椅子
10 月前
  • 本文章拟解决问题(不是这些问题请绕路):
  • 一、需求
  • 二、操作步骤
    • 1.从数据库中读入数据
      • 读入的原始数据如图:
    • 2.将数据炸裂:将JSON列表拆分,一个JSON对象一行
      • 1). 具体的代码过程:
        • 踩坑:因为pandas读入数据,将 `JSON列表` 格式当做 `object`,所以在数据炸裂前需要先将数据格式改成 `list`。
      • 2). 数据炸裂结果,如下图所示:数据规模 从 `288 * 3` 变成 `7488 * 3`,原始数据中的JSON列表已经被拆成一个一个的JSON对象。

      本文章拟解决问题(不是这些问题请绕路):

      • pandas 读入数据时,将 list 读成了 object、str 格式,如何还原成 list 格式。
      • 对 DataFrame 中的 list 格式的列进行炸裂,一行变成多行,列表中的列元素被拆开成单独的一行。
      • 使用 explode() 函数对 DataFrame 进行炸裂。
      • 如果需要看,如果将 DataFrame 中的 JSON、dict、map、key:value 格式的数据解析出来,请看另一篇文章

      数据库中有一张传感器的数据表,如下图所示:其中的 data 字段中的数据是列表(数组),需要列表数据拆分成多行。
      数据库中原始数据
      下面是表中前几条数据:表头——id, data, create_time

      id	data	created_time
      1	[{"id":"设备状态","error":"0","name":"T101022","value":"1"},{"id":"Pf","error":"0","value":"0.943000"},{"id":"Fr","error":"0","value":"50.029999"},{"id":"Pfa","error":"0","value":"0.936000"},{"id":"Pfb","error":"0","value":"0.945000"},{"id":"Pfc","error":"0","value":"0.956000"},{"id":"EPI","error":"0","value":"2867518.750000"},{"id":"EPE","error":"0","value":"572.519958"},{"id":"EQL","error":"0","value":"965824.437500"},{"id":"EQC","error":"0","value":"13.120000"},{"id":"Ua","error":"0","value":"239.500000"},{"id":"Ub","error":"0","value":"241.000000"},{"id":"Uc","error":"0","value":"240.400009"},{"id":"Ia","error":"0","value":"421.200012"},{"id":"Ib","error":"0","value":"388.200012"},{"id":"Ic","error":"0","value":"423.000000"},{"id":"Uab","error":"0","value":"416.100037"},{"id":"Ubc","error":"0","value":"416.900024"},{"id":"Uca","error":"0","value":"415.600006"},{"id":"P","error":"0","value":"279.000000"},{"id":"Pa","error":"0","value":"94.200005"},{"id":"Pb","error":"0","value":"88.199997"},{"id":"Pc","error":"0","value":"96.599998"},{"id":"Q","error":"0","value":"80.400002"},{"id":"Qa","error":"0","value":"30.599998"},{"id":"Qb","error":"0","value":"24.600000"},{"id":"Qc","error":"0","value":"23.400000"},{"id":"Sa","error":"0","value":"100.799995"},{"id":"Sb","error":"0","value":"93.599998"},{"id":"Sc","error":"0","value":"103.200005"},{"id":"S","error":"0","value":"297.600006"}]	2022-04-01 00:00:00
      2	[{"id":"设备状态","error":"0","name":"T101023","value":"1"},{"id":"Pf","error":"0","value":"-0.004000"},{"id":"Fr","error":"0","value":"50.020000"},{"id":"Pfa","error":"0","value":"0.139000"},{"id":"Pfb","error":"0","value":"-0.299000"},{"id":"Pfc","error":"0","value":"0.187000"},{"id":"EPI","error":"0","value":"599556.000000"},{"id":"EPE","error":"0","value":"1714.469971"},{"id":"EQL","error":"0","value":"165549.343750"},{"id":"EQC","error":"0","value":"297128.687500"},{"id":"Ua","error":"0","value":"239.000000"},{"id":"Ub","error":"0","value":"240.800003"},{"id":"Uc","error":"0","value":"240.000000"},{"id":"Ia","error":"0","value":"48.720001"},{"id":"Ib","error":"0","value":"86.400002"},{"id":"Ic","error":"0","value":"96.479996"},{"id":"Uab","error":"0","value":"415.499969"},{"id":"Ubc","error":"0","value":"416.300018"},{"id":"Uca","error":"0","value":"414.799988"},{"id":"P","error":"0","value":"-0.240000"},{"id":"Pa","error":"0","value":"1.600000"},{"id":"Pb","error":"0","value":"-6.160000"},{"id":"Pc","error":"0","value":"4.320000"},{"id":"Q","error":"0","value":"-52.480003"},{"id":"Qa","error":"0","value":"-11.200000"},{"id":"Qb","error":"0","value":"-19.199999"},{"id":"Qc","error":"0","value":"-22.080000"},{"id":"Sa","error":"0","value":"11.599999"},{"id":"Sb","error":"0","value":"20.799999"},{"id":"Sc","error":"0","value":"23.120001"},{"id":"S","error":"0","value":"55.520000"}]	2022-04-01 00:00:00
      3	[{"id":"设备状态","error":"0","name":"T101024","value":"1"},{"id":"Pf","error":"0","value":"-0.004000"},{"id":"Fr","error":"0","value":"50.029999"},{"id":"Pfa","error":"0","value":"0.211000"},{"id":"Pfb","error":"0","value":"-0.120000"},{"id":"Pfc","error":"0","value":"-0.114000"},{"id":"EPI","error":"0","value":"93052.085938"},{"id":"EPE","error":"0","value":"1660.539917"},{"id":"EQL","error":"0","value":"75957.359375"},{"id":"EQC","error":"0","value":"348346.218750"},{"id":"Ua","error":"0","value":"239.100006"},{"id":"Ub","error":"0","value":"240.800003"},{"id":"Uc","error":"0","value":"240.100006"},{"id":"Ia","error":"0","value":"77.839996"},{"id":"Ib","error":"0","value":"59.599998"},{"id":"Ic","error":"0","value":"89.680008"},{"id":"Uab","error":"0","value":"415.600006"},{"id":"Ubc","error":"0","value":"416.499969"},{"id":"Uca","error":"0","value":"414.900024"},{"id":"P","error":"0","value":"-0.160000"},{"id":"Pa","error":"0","value":"3.920000"},{"id":"Pb","error":"0","value":"-1.680000"},{"id":"Pc","error":"0","value":"-2.400000"},{"id":"Q","error":"0","value":"-52.399998"},{"id":"Qa","error":"0","value":"-17.760000"},{"id":"Qb","error":"0","value":"-13.839999"},{"id":"Qc","error":"0","value":"-20.799999"},{"id":"Sa","error":"0","value":"18.559999"},{"id":"Sb","error":"0","value":"14.320001"},{"id":"Sc","error":"0","value":"21.440001"},{"id":"S","error":"0","value":"54.320000"}]	2022-04-01 00:00:00
      

      二、操作步骤

      1.从数据库中读入数据

      source = pd.read_sql(sql="""
      SELECT
      	`data`,
      	created_time
      	table_name
      """, con=con)
      

      读入的原始数据如图:

      2.将数据炸裂:将JSON列表拆分,一个JSON对象一行

      1). 具体的代码过程:

      踩坑:因为pandas读入数据,将 JSON列表 格式当做 object,所以在数据炸裂前需要先将数据格式改成 list。
      # 将 data 列的数据类型 object 转成 str,并将原始数据中的 '['、']'删除
      source['data'] = source['data'].str.replace('[', '')
      source['data'] = source['data'].str.replace(']', '')
      # 将 JSON列表 中的JSON对象之间使用 ‘#’隔开
      source['data'] = source['data'].str.replace('},{', '}#{')
      # 使用 lambda 表达式,按照 ‘#’ 切割str, 就能得到数据格式为 list 的列表
      source['data'] = source['data'].apply(lambda x: x.split('#'))
      # 使用 explode() 函数对列表进行炸裂,一行变多行
      data = source.explode('data')
      

      2). 数据炸裂结果,如下图所示:数据规模 从 288 * 3 变成 7488 * 3,原始数据中的JSON列表已经被拆成一个一个的JSON对象。

      1. 使用 explode() 行数对DataFrame进行炸裂,需要保证炸裂的目标列的格式是list
      2. 小技巧:如果DataFrame的某一列本该是list,但是被当做object、str等类型时,可以将该列当做转成str后,在列表元素之间 使用特殊符号(该符号不能在列表中出现过,不然切割时会污染原始数据)来进行隔开,然后使用split对该列进行切割,即可将该列转变成list格式了。
      文章目录本文章拟解决问题(不是这些问题请绕路):一、笔者的遇到的困难二、操作步骤1.从数据库中读入数据读入的原始数据如图:2.将数据炸裂:将JSON列表拆分,一个JSON对象一行1). 具体的代码过程:踩坑:因为pandas读入数据,将 `JSON列表` 格式当做 `object`,所以在数据炸裂前需要先将数据格式改成 `list`。2). 数据炸裂结果,如下图所示:数据规模 从 `288 * 3` 变成 `7488 * 3`,原始数据中的JSON列表已经被拆成一个一个的JSON对象。总结本文章拟解决问题
      json与dataframe的互相转换1、两类json格式(1)对象格式(2)数组对象格式2、json转dataframe2.1 对象格式json2.2 数组对象格式json3、dataframe转json3.1 df.to_json()方法3.2 to_dict()方法 1、两类json格式 (1)对象格式 {"name":"JSON","address":"北京市西城区","age":25}#JSON的对象格式的字符串 (2)数组对象格式 [{"name":"JSON","address":"北京市西
      本博文借助笔者可以自己根据数据生成csv文件,重新生成一组csv文件,避免将str内复杂的列表读取成str之后难以操作的问题,本博客记录该解决方案的背景和方法。 1. 背景 在将一些数据从一个平台,换到另一个平台去处理时,使用了常用的csv文件去存储数据。 最开始时,直接将narry格式数据,用dic字典处理,暴力存储过程,产生了错误。 d = {'feature':test_fea, ...
      与第三方API接口对接的时候,是经常会遇到多层嵌套的json的,而我们需要的数据可能仅仅是某几个, 或者是需要转换成二维表用来存入数据库。通常我都是用遍历来一遍一遍的for循环获取,但这样效率 差劲不说,代码还显得特别low,今天安利一个非常快捷的工具给大家---pd.json_normalize。 首先导入相关库 import pandas as pd from pandas.io.json import json_normalize 设定一个json df = { "error"
      json文件中的json数据不能嵌套json格式数据。 DataFrame是一个一个Row类型的RDD,df.rdd()/df.javaRdd()。 可以两种方式读取json格式的文件。 df.show()默认显示前20行数据。 DataFrame原生API可以操作DataFrame(不方便)。
      经过udf返回形式数据后返回字典列数据,或者本身初始数据就是有字典列的。即将字典列中拆分成id和name列。 二、解决方案 在pyspark中,可以使用函数将DataFrame中的字典列拆分为多列: [1] pyspark 根据字典添加多列 [2] UDF函数的使用、UDF传入多个参数、UDF传出多个参数、传入特殊数据类型 [3] 官方文档:pyspark.sql.functions.from_json [4] SSS —— Spark Structured Streaming 之单列拆分成多列
      转为数值类型还可以使用to_numeric()函数 DataFrame每一列的数据类型必须相同,当有些数据中有缺失,但不是NaN时(如missing,null等),会使整列数据变成字符串类型而不是数值型,这个时候可以使用to_numeric处理 #创造包含'missing'为缺失值的数据 tips_sub_miss = tips.head(10) tips_sub_miss.loc 之前在实际的项目研发中,需要对一些复杂的json数据进行取值操作,由于json数据的层级很深,所以经常取值的代码会变成类似这样: value = data['store']['book'][0]['title'] 有的甚至会比这个更长,看起来特别不舒服,而且假如原始的数据发生了一个变化,你需要针对你的代码再做一个工作量不小的适配工作,非常不方便,所以我想能否可以快速的对一串json数据取到想要的key对应的value值呢? 经过一段尝试,终于成功的解决了这个问题,其实核心思想就是将取值过程流程化,代
      Pandas **Pandas 是 Python 语言的一个扩展程序库,用于数据分析。**Pandas 一个强大的分析结构化数据的工具集,基础是 Numpy(提供高性能的矩阵运算)。Pandas 可以从各种文件格式比如 CSV、JSON、SQL、Microsoft Excel 导入数据。Pandas 可以对各种数据进行运算操作,比如归并、再成形、选择,还有数据清洗和数据加工特征。 Pandas 的主要数据结构是 Series (一维数据)与 DataFrame(二维数据)。 Pandas 数据结构 - Se
      如果你想将一个Pandas DataFrame转换成一个list类型,可以使用Pandas库中的values属性。values属性返回一个由DataFrame中的所有值组成的二维数组,我们可以使用tolist()方法将它转换成一个list类型。例如: import pandas as pd # 创建一个DataFrame df = pd.DataFrame({'A': [1, 2, 3], 'B': ['a', 'b', 'c']}) # 将DataFrame转换成list类型 data_list = df.values.tolist() print(data_list) 输出结果为: [[1, 'a'], [2, 'b'], [3, 'c']] 这里我们使用了DataFrame的values属性获取所有的数据值,并使用tolist()方法将其转换成list类型。
 
推荐文章
旅途中的鼠标垫  ·  PEL和平精英职业联赛电竞赛事-PEC赛季比赛赛程直播-腾讯游戏
3 月前
追风的啤酒  ·  福建莆田过年的特色美食“红团”,味道甜而不腻,寓意好,你吃过吗 ...
1 年前
温文尔雅的书包  ·  六书指的是什么
1 年前
奔跑的鸭蛋  ·  《临江仙·夜饮东坡醒复醉》_苏轼的诗词_诗词名句网
1 年前
狂野的荒野  ·  电影《紧急救援》将于大年初一全国上映-新华网
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
小百科 - 百科知识指南
© 2024 ~ 沪ICP备11025650号