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

PAR*_*MAR 5 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']}
                           }
Run Code Online (Sandbox Code Playgroud)

我将其传递给数据框:

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

但我收到的错误是:

ValueError:将 dicts 与非系列混合可能会导致排序不明确。

谁能帮我这个?

CSV 文件应如下所示:

在此处输入图片说明

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

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'])
Run Code Online (Sandbox Code Playgroud)

但我获得的输出为:

在此处输入图片说明

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

所需的输出是:

 |      |     |     |     |Bollinger Bands|        |        |
 |Sr.No.|Comp |     |     |Field1         |Field2  |Field3  |
Run Code Online (Sandbox Code Playgroud)

jpp*_*jpp 4

pd.DataFrame需要一个包含列表值的字典,但您正在提供列表字典值的不规则组合。

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

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

data.update(data.pop('Bollinger Bands'))
Run Code Online (Sandbox Code Playgroud)

然后构造一个具有一个标头级别的常规数据帧:

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

这给出:

   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
Run Code Online (Sandbox Code Playgroud)

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

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']}}
Run Code Online (Sandbox Code Playgroud)