我有一个字符串,格式如下:
string_1 = '{!Cat1!:{!A!:!xd!# !B!:!yd!# !C!:!zd!# !D!:[!nd!#!nd2!#!nd3!#!nd4!]# !E!:!hd!}#!Cat2!:{!A1!:!xd1!# !B1!:!yd1!# !C1!:!zd1!# !D1!:[!nd1!#!nd21!#!nd31!#!nd41!]# !E1!:!hd1!}}'
我想检查是否有一种方法可以将上面的字符串转换为下面的dataframe:
string_1_to_df
Col1 Col2 Col3
Cat1 A xd
Cat1 B yd
Cat1 C zd
Cat1 D nd
Cat1 D nd2
Cat1 D nd3
Cat1 D nd4
Cat1 E hd
Cat2 A1 xd1
Cat2 B1 yd1
Cat2 C1 zd1
Cat2 D1 nd1
Cat2 D1 nd21
Cat2 D1 nd31
Cat2 D1 nd41
Cat2 E1 hd1
我试过用密码
new_String = string_1 .replace('!', '"').replace('#', ',')
new_String = json.loads(new_String )
new_String_df = pd.DataFrame.from_dict(new_String)
但我得到的输出是不同的,不是在一个 Dataframe
3条答案
按热度按时间svmlkihl1#
从
json.loads
中获取python对象后的下一步是扁平化嵌套数据。有很多方法可以做到这一点,但由于你可能不会使用pandas,dataframe甚至常规的旧python类型的高级方法,因此迭代对象可能是你的家庭作业的正确级别。您可能需要嵌套几个
for
循环。举个例子,要从这个嵌套输出中提取dataframe的前两列:要获得第三个元素,可以再次迭代
js[col1][col2]
。请注意,这一层的复杂性有所增加,因为您有像'A':'xd'
和'D': ['nd', 'nd2', 'nd3', 'nd4']
这样的元素,因此您需要确定是否使用str
或list
类型的字典值并进行适当的迭代。完成后,您可以使用以下命令推入 Dataframe :
btqmn9zl2#
分两个阶段进行:1)字符串解析,2) Dataframe 构造:
yc0p9oo03#
请注意,在代码中使用
eval()
被认为是不好的做法。但是,这里有一个使用它的解决方案:输出:
理想情况下,你应该使用正则表达式,所以我会弄清楚这一点,并很快更新这篇文章。