在Python中迭代嵌套有序字典,然后将键(或值)保存到Pandas数据框中
我正在尝试在Python中遍历嵌套的有序字典。我知道可以用嵌套的for循环来做到这一点,比如这样:
food = OrderedDict([('Fruits', OrderedDict([('Apple', 50), ('Banana', 100), ('Pear', 200)])),
('Vegetables', OrderedDict([('Carrot', 10), ('Broccoli', 5), ('Corn', 40)]))])
for value in food.itervalues():
for key in value.iterkeys():
print key
这样可以获取键(或值)。但是,我想知道有没有办法用一行代码来实现这个功能?我想把字符串类型的键(也就是水果的名字)保存到一个pandas数据框中(数字不需要)。这是我尝试过的:
food_df = pd.DataFrame({'Food': key for key in value.iterkeys() for value in food.itervalues()})
但是这引发了一个错误:
File "C:\Python27\lib\site-packages\pandas\core\frame.py", line 397, in __init__
mgr = self._init_dict(data, index, columns, dtype=dtype)
File "C:\Python27\lib\site-packages\pandas\core\frame.py", line 528, in _init_dict
dtype=dtype)
File "C:\Python27\lib\site-packages\pandas\core\frame.py", line 5670, in _arrays_to_mgr
index = extract_index(arrays)
File "C:\Python27\lib\site-packages\pandas\core\frame.py", line 5708, in extract_index
raise ValueError('If using all scalar values, you must must pass'
ValueError: If using all scalar values, you must must pass an index
有什么想法吗?谢谢!
1 个回答
3
[item for sublist in map(lambda a: a.keys(), food.itervalues()) for item in sublist]
这会返回
['Apple', 'Banana', 'Pear', 'Carrot', 'Broccoli', 'Corn']
在你的情况下。
然后你可以像往常一样创建一个数据框。
food_pd = pd.DataFrame([item for sublist in map(lambda a: a.keys(), food.itervalues()) for item in sublist], columns=["Food"])