Python 将txt文件中保存的词典列表转换为数据帧

Python 将txt文件中保存的词典列表转换为数据帧,python,pandas,Python,Pandas,我有一个文本文件,基本上是多个python字典的列表。 文本文件如下所示 [{ques:[什么会导致弯板打滑?],选项:[{option:This opt no1,correct:true,number:1},{option:This opt no.2,correct:true,number:2},{option:[|这是opt3,correct:false,number:3}],indx:2.1.01-001}, {ques:[什么会导致危险情况?],选项:[{option:option1,c

我有一个文本文件,基本上是多个python字典的列表。 文本文件如下所示

[{ques:[什么会导致弯板打滑?],选项:[{option:This opt no1,correct:true,number:1},{option:This opt no.2,correct:true,number:2},{option:[|这是opt3,correct:false,number:3}],indx:2.1.01-001}, {ques:[什么会导致危险情况?],选项:[{option:option1,correct:true,number:1},{option:opt2,correct:true,number:2}],indx:2.1.01-004}] 我想做什么

我想系统地将字典转换为熊猫数据框架:

什么不起作用

期望输出


您必须将dict展平并索引所有数据点。

以下是所需的代码:

数据=[{ques:[什么会导致弯管打滑?],选项:[{option:This opt no1,correct:True,number:1},{option:This opt no.2,correct:True,number:2},{option:[|这是opt3,correct:False,number:3}],indx:2.1.01-001}, {ques:[什么会导致危险情况?],选项:[{option:option1,correct:True,number:1},{option:opt2,correct:True,number:2}],indx:2.1.01-004}] s=[] 对于数据中的行: 问题=行。获取“问题”[0] idx=行。获取'indx' 对于row.getoptions中的选项,[]: number=option.getnumber,np.nan number=f这是选项{number}编辑 correct=option.getcorrect,np.nan s、 问题, 数字=数字, 正确的, 索引=idx df=pd.DataFrames df
您必须将dict展平并索引所有数据点。

以下是所需的代码:

数据=[{ques:[什么会导致弯管打滑?],选项:[{option:This opt no1,correct:True,number:1},{option:This opt no.2,correct:True,number:2},{option:[|这是opt3,correct:False,number:3}],indx:2.1.01-001}, {ques:[什么会导致危险情况?],选项:[{option:option1,correct:True,number:1},{option:opt2,correct:True,number:2}],indx:2.1.01-004}] s=[] 对于数据中的行: 问题=行。获取“问题”[0] idx=行。获取'indx' 对于row.getoptions中的选项,[]: number=option.getnumber,np.nan number=f这是选项{number}编辑 correct=option.getcorrect,np.nan s、 问题, 数字=数字, 正确的, 索引=idx df=pd.DataFrames df 使用explode并应用pd.json\u normalize

输出:

    ques                                    indx        option          correct
0   What can cause a dangerous situation?   2.1.01-004  option1         True
1   What can cause a dangerous situation?   2.1.01-004  opt2            True
2   What can cause skidding on bends?       2.1.01-001  This opt no1    True
3   What can cause skidding on bends?       2.1.01-001  this opt no.2   True
4   What can cause skidding on bends?       2.1.01-001  [| this is opt3 False
或者只使用json_normalize来解析json数据

数据 [{ques:[什么会导致弯板打滑?],选项:[{option:This opt no1,correct:true,number:1},{option:This opt no.2,correct:true,number:2},{option:[|这是opt3,correct:false,number:3}],indx:2.1.01-001}, {ques:[什么会导致危险情况?],选项:[{option:option1,correct:true,number:1},{option:opt2,correct:true,number:2}],indx:2.1.01-004}] ' data=json.loadsdata\u str df=pd.json\u normalizedata,记录路径=['options',元=['indx','ques'] printdf 使用explode并应用pd.json\u normalize

输出:

    ques                                    indx        option          correct
0   What can cause a dangerous situation?   2.1.01-004  option1         True
1   What can cause a dangerous situation?   2.1.01-004  opt2            True
2   What can cause skidding on bends?       2.1.01-001  This opt no1    True
3   What can cause skidding on bends?       2.1.01-001  this opt no.2   True
4   What can cause skidding on bends?       2.1.01-001  [| this is opt3 False
或者只使用json_normalize来解析json数据

数据 [{ques:[什么会导致弯板打滑?],选项:[{option:This opt no1,correct:true,number:1},{option:This opt no.2,correct:true,number:2},{option:[|这是opt3,correct:false,number:3}],indx:2.1.01-001}, {ques:[什么会导致危险情况?],选项:[{option:option1,correct:true,number:1},{option:opt2,correct:true,number:2}],indx:2.1.01-004}] ' data=json.loadsdata\u str df=pd.json\u normalizedata,记录路径=['options',元=['indx','ques'] printdf
谢谢。您是否可以添加代码,将列选项添加到文本中。例如,这是选项1。我不需要数字,只需要选项的文本。请参见上文;-@FaisalI的意思是我不需要列“数字”,而是一列名为“选项”,显示所有问题的选项文本,如:此选项1,此选项2.text not Digits 1,2,3,1,2我不确定我是否理解,因为在pandas数据框中存储数据是一种不方便的方式。通常,pandas提供的各种功能会根据需要对数据进行切片。如果您需要副标题,您可以创建一个系列,但这会使不需要它的数据集变得复杂。谢谢。您是否可以添加代码,将列选项添加到文本中。例如,这是选项1。我不需要数字,但需要选项的文本。请参见上文;-@FaisalI的意思是我不需要列“数字”,而是一列名为“选项”,显示所有问题的选项文本,如:此选项1,此选项2。文本不是数字1,2,3,1,2我不确定我是否需要理解为将数据存储在dataf中是一种不方便的方式
拉姆。通常使用pandas提供的各种功能根据需要对数据进行切片。如果你想要副标题,你可以创建一个系列,但这会使不需要它的数据集变得复杂。谢谢@Ferris。我接受他的建议,在原始数据上使用json_规范化更方便。谢谢@Ferris。我接受他的建议,在原始数据上使用json_规范化更方便。
result = (
df_ques.explode("ques")
       .explode("options")
       .groupby(['ques', 'indx'])['options']
       .apply(pd.json_normalize)
       .reset_index()
       .drop(columns=['level_2', 'number'])
)
result
    ques                                    indx        option          correct
0   What can cause a dangerous situation?   2.1.01-004  option1         True
1   What can cause a dangerous situation?   2.1.01-004  opt2            True
2   What can cause skidding on bends?       2.1.01-001  This opt no1    True
3   What can cause skidding on bends?       2.1.01-001  this opt no.2   True
4   What can cause skidding on bends?       2.1.01-001  [| this is opt3 False
            option  correct  number        indx  \
0     This opt no1     True       1  2.1.01-001   
1    this opt no.2     True       2  2.1.01-001   
2  [| this is opt3    False       3  2.1.01-001   
3          option1     True       1  2.1.01-004   
4             opt2     True       2  2.1.01-004   

                                    ques  
0      What can cause skidding on bends?  
1      What can cause skidding on bends?  
2      What can cause skidding on bends?  
3  What can cause a dangerous situation?  
4  What can cause a dangerous situation?