【问题标题】:Iterating over nested Ordered Dictionaries in Python, then Saving keys (or values) to Pandas dataframe在 Python 中迭代嵌套的有序字典,然后将键(或值)保存到 Pandas 数据帧
【发布时间】:2025-11-29 22:00:02
【问题描述】:

我正在尝试迭代 Python 中的嵌套有序字典。我知道我可以这样做:

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

使用嵌套的 for 循环获取键(或值)。但是,我怎样才能在一行中做到这一点?我试图仅将字符串键(即水果名称)保存到 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

有什么想法吗?谢谢!

【问题讨论】:

  • 请编辑您的问题以包含您想要的输出。我不确定您是否要丢弃有关某物是水果还是蔬菜的信息。

标签: python pandas nested dataframe ordereddictionary


【解决方案1】:
[item for sublist in map(lambda a: a.keys(), food.itervalues()) for item in sublist]

这会返回

['Apple', 'Banana', 'Pear', 'Carrot', 'Broccoli', 'Corn']

在你的情况下。

然后你可以像往常一样创建一个 DataFrame。

food_pd = pd.DataFrame([item for sublist in map(lambda a: a.keys(), food.itervalues()) for item in sublist], columns=["Food"])

【讨论】:

  • 漂亮!非常感谢!
  • 请点赞并接受 :)。事实上,flatten 列表列表还有其他方法:*.com/questions/952914/… 所以我们正在使用的这个 implicit 双循环也有其他选择。但是为了简洁的一行,就足够了
  • 目前无法投票(需要声望分数为 15)!并感谢您提供信息!
  • 有什么原因我不能对这些值(即 50、100、200、10、5、40)执行此操作?我尝试用 a.values() 替换 a.keys(),但它返回一个空列表。
  • map 中使用(a.keys(), a.values())(带括号)。这将返回一个键值对元组,例如('Apple', 50).