pd.DataFrame(data,columns = [])。如何传递带有嵌套字典的数据?

时间:2019-01-04 08:16:26

标签: python python-3.x pandas

我的数据就像:

data = {'Sr.No.': Sr_no,
        'CompanyNames': Company_Names,
        'YourChoice1': ['45','45','45','45','45','45','45','45','45'],
        'YourChoice2': ['45','45','45','45','45','45','45','45','45'],
        'Bollinger Bands': {'Field1': ['45','45','45','45','45','45','45','45'],
                            'Field2': ['45','45','45','45','45','45','45','45'],
                            'Field3':['45','45','45','45','45','45','45','45']}
                           }

我要将以下内容传递给数据框:

df = pd.DataFrame(data, columns = ['Sr.No.','CompanyNames','YourChoice1','YourChoice2','Bollinger Bands'])

但是我收到以下错误消息:

  

ValueError:将字典与非系列混合使用可能会导致顺序不明确。

有人可以帮我吗?

CSV文件应如下所示:

enter image description here

我尝试了这样的第一种解决方案:

df1 = pd.DataFrame(data, columns = ['Sr.No.', 'CompanyNames','YourChoice1','YourChoice2'])
bbands = data.pop('Bollinger Bands')
df2 = pd.DataFrame(bbands)

df = pd.concat([df1, df2], axis=1, keys=['','Bollinger Bands'])

但是我得到的输出为:

enter image description here

我希望“布林带”应该只出现在第一列中,而不是全部出现在其中……”

所需的输出是:

 |      |     |     |     |Bollinger Bands|        |        |
 |Sr.No.|Comp |     |     |Field1         |Field2  |Field3  |

2 个答案:

答案 0 :(得分:2)

pd.DataFrame期望使用具有列表值的字典,但是您正在馈送列表列表值的不规则组合。

您想要的输出令人分心,因为它不符合常规的MultiIndex应该应避免使用空字符串作为第一级的标签。是的,您可以出于演示目的而获得所需的输出,但是建议以非结构化的方式存储数据是不建议的。

相反,我建议您在构造数据框之前 展平字典:

data.update(data.pop('Bollinger Bands'))

然后使用一个标头级别构造一个常规数据框:

df = pd.DataFrame(data, columns=['Sr.No.','CompanyNames','YourChoice1','YourChoice2',
                                 'Field1', 'Field2', 'Field3'])

这给出了:

   Sr.No.  CompanyNames YourChoice1 YourChoice2 Field1 Field2 Field3
0       0             8          45          45     45     45     45
1       1             9          45          45     45     45     45
2       2            10          45          45     45     45     45
3       3            11          45          45     45     45     45
4       4            12          45          45     45     45     45
5       5            13          45          45     45     45     45
6       6            14          45          45     45     45     45
7       7            15          45          45     45     45     45

上述示例的输入数据示例:

data = {'Sr.No.': list(range(8)),
        'CompanyNames': list(range(8, 16)),
        'YourChoice1': ['45','45','45','45','45','45','45','45'],
        'YourChoice2': ['45','45','45','45','45','45','45','45'],
        'Bollinger Bands': {'Field1': ['45','45','45','45','45','45','45','45'],
                            'Field2': ['45','45','45','45','45','45','45','45'],
                            'Field3':['45','45','45','45','45','45','45','45']}}

答案 1 :(得分:1)

出现错误的原因是您在数据中嵌套了字典。由于您只有Bollinger Bands作为第二级字典,因此可以pop删除,然后concat保留到数据框。

bbands = data.pop('Bollinger Bands')
new_df = pd.concat([pd.DataFrame(data), pd.DataFrame(bbands)], axis=1).set_index('Sr.No.')

(我假设Sr.No.是您的索引列。)

上面的代码将创建一个新的数据帧,而没有标题的Bollinger Bands部分。您将必须手动将其添加到文件中,并将数据框附加到同一文件中。

with open('my_csv.csv', 'w') as f:
    f.write("      |     |     |     |Bollinger Bands|        |        \n")
    new_df.to_csv(f, sep='|') 

我不确定您为什么需要在开头和结尾处|。所以我在解决方案中省略了。