我的数据就像:
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文件应如下所示:
我尝试了这样的第一种解决方案:
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'])
但是我得到的输出为:
我希望“布林带”应该只出现在第一列中,而不是全部出现在其中……”
所需的输出是:
| | | | |Bollinger Bands| | |
|Sr.No.|Comp | | |Field1 |Field2 |Field3 |
答案 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='|')
我不确定您为什么需要在开头和结尾处|
。所以我在解决方案中省略了。