Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将单元格中的文本(json对象?)转换为列_Python_Json_Pandas - Fatal编程技术网

Python 将单元格中的文本(json对象?)转换为列

Python 将单元格中的文本(json对象?)转换为列,python,json,pandas,Python,Json,Pandas,我试图从数据框中的文本值中提取数据 df = pd.DataFrame(['{58={1=4.5}, 50={1=4.0}, 42={1=3.5}, 62={1=4.75}, 54={1=4.25}, 46={1=3.75}}', '{a={1=15.0}, b={1=14.0}, c={1=13.0}, d={1=15.5}, e={1=14.5}, f={1=13.5}}', '{58={1=15.5}, 50={1=14.5}, 42

我试图从数据框中的文本值中提取数据

df = pd.DataFrame(['{58={1=4.5}, 50={1=4.0}, 42={1=3.5}, 62={1=4.75}, 54={1=4.25}, 46={1=3.75}}',
              '{a={1=15.0}, b={1=14.0}, c={1=13.0}, d={1=15.5}, e={1=14.5}, f={1=13.5}}',
              '{58={1=15.5}, 50={1=14.5}, 42={1=13.5}, 62={1=16.0}, 54={1=15.0}, 46={1=14.0}}'])
我试过了

df.apply(pd.Series)
pd.DataFrame(df.tolist(),index=df.index)
json_normalize(df)
但是没有成功

我希望有新的第50、52、a、b、c等列,以及没有“1=”的值,我不介意NaN。怎么做?这是什么格式?
非常感谢您的帮助。

有一种方法可以通过更改字符串来实现,从而使数据看起来像一本字典。使用
regex
可能有一种更聪明的方法,但这取决于对可用的全部数据的假设

我的步骤如下:

  • 更改字符串以将数据转换为类似于dict的结构
  • 使用
    literal\u eval
    转换
    dict上的
    str
  • df
    展开到新的
    数据框中
  • 从ast导入文字\u评估
    df[0]=df[0].str.replace('={1=',“':”)\#remove 1=和左内dict符号{
    .str.replace(“},”,“,”)\#删除右内dict符号}
    .str.replace('}}','}')\\删除最外面的额外}
    .str.replace(“{',“{'”)\ \将适当的字符串符号添加到第一个值。
    .apply(字面意义上的评估)#读作一个dict
    pd.DataFrame(df[0].values.tolist())#作为新的数据帧展开
    出[1]:
    58 50 42 62 54 46 a b c d e f
    0 4.5 4.0 3.5 4.75 4.25 3.75楠楠楠楠楠
    1楠楠15.0 14.0 13.0 15.5 14.5 13.5
    2 15.5 14.5 13.5 16.00 15.00 14.00楠楠楠楠楠楠楠楠
    
    使用特定替换来准备有效的json字符串:

    In [184]: new_df = pd.DataFrame(df.apply(lambda s: s.str.replace(r'(\w+)=\{1=([^}]+)\}', '"\\1":\\2'))[0].apply(pd.io
         ...: .json.loads).tolist())                                                                                     
    
    In [185]: new_df                                                                                                     
    Out[185]: 
         42     46    50     54    58     62     a     b     c     d     e     f
    0  3.5   3.75   4.0   4.25   4.5   4.75  NaN   NaN   NaN   NaN   NaN   NaN  
    1 NaN   NaN    NaN   NaN    NaN   NaN     15.0  14.0  13.0  15.5  14.5  13.5
    2  13.5  14.00  14.5  15.00  15.5  16.00 NaN   NaN   NaN   NaN   NaN   NaN  
    

    你从哪里得到的字符串列表?可能不是一个非常有用的注释,但我可能不会尝试将其导入到数据帧中,而是尝试以不同的格式获取字符串。除了此格式的列之外,我还获得了一个带有常用列的csv。不幸的是,不可能请求目录format@hash伊莫夫,你能告诉我在将字符串放入数据框之前从何处获取该字符串的代码吗?@RomanPerekhrest正如我所说,我在CSV中获取了这些值。将整个CSV放在这里是没有意义的。我提供的示例完全复制了行为或熊猫,这种CSV方式非常优雅。@calestini你的方法也非常明确和有用。我希望你们能保留它。谢谢你们两个!@hashimov,将它回滚,但在这个答案上可以获得很多。@RomanPerekhrest这是一个很好的解决方案,有没有办法保持json的顺序?