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
可能有一种更聪明的方法,但这取决于对可用的全部数据的假设
我的步骤如下:
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的顺序?