Python 3.x 将字典值的数据帧转换为多索引数据帧的最有效方法是什么?

Python 3.x 将字典值的数据帧转换为多索引数据帧的最有效方法是什么?,python-3.x,pandas,dataframe,dictionary,multi-index,Python 3.x,Pandas,Dataframe,Dictionary,Multi Index,我有一个dataframe(最初是从字典列表中创建的),现在它最终有了包含dataframe每个单元格中数据的字典。我想以最有效的方式将其转换为多索引数据帧(如下图所示) 以下是我目前的成就: import datetime as dt import numpy as np import pandas as pd fruit_inventory_lst = [] fruit_inventory_lst.append({'Date':dt.datetime(2020,1,1),'Apple':

我有一个dataframe(最初是从字典列表中创建的),现在它最终有了包含dataframe每个单元格中数据的字典。我想以最有效的方式将其转换为多索引数据帧(如下图所示)

以下是我目前的成就:

import datetime as dt
import numpy as np
import pandas as pd

fruit_inventory_lst = []

fruit_inventory_lst.append({'Date':dt.datetime(2020,1,1),'Apple':{'Very Ripe':5},'Orange':{'Ripe':2}})
fruit_inventory_lst.append({'Date':dt.datetime(2020,1,2),'Apple':{'Very Ripe':10},'Banana':{'Not Ripe':3}})
fruit_inventory_lst.append({'Date':dt.datetime(2020,1,3),'Apple':{'Ripe':10},'Orange':{'Ripe':5}})

df = pd.DataFrame(fruit_inventory_lst).set_index('Date')

df >>>

             Apple              Orange               Banana
Date            
2020-01-01  {'Very Ripe': 5}    {'Ripe': 2}          NaN
2020-01-02  {'Very Ripe': 10}   NaN                  {'Not Ripe': 3}
2020-01-03  {'Ripe': 10}        {'Ripe': 5}          NaN
所以问题是,我如何以最有效的方式将这种特定类型的数据帧(结合字典和np.nan值)转换为多索引数据帧?最终数据帧的形式应如下所示。我面临的主要问题是如何正确构造数据,以便将其输入到下面的多索引数据帧格式中(或者是否有方法直接转换上面的数据帧)

为清晰起见,所需输出为:

           Apple                Orange                  Banana
           Ripeness  Quantity   Ripeness    Quantity    Ripeness    Quantity
Date                        
2020-01-01 Very Ripe 5          Ripe        2           NaN         NaN
2020-01-02 Very Ripe 10         NaN         NaN         Not Ripe    3
2020-01-03 Ripe      10         Ripe        5           NaN         NaN

谢谢

也许还有别的办法。我解决这个问题的方法是首先处理字典,这样我们就可以得到所需数据帧输出的精确字典格式

def seperate(data):
    new_data = []
    for i in data:
        item = {}
        for j in i.keys():
            if j == "Date":
                item['Date'] = i['Date']
            else:
                state = list(i[j].keys())[0]
                item[j+'_ripe'] = state
                item[j+'_Quantity'] = i[j][state]
        new_data.append(item)
    return new_data
df = pd.DataFrame(seperate(fruit_inventory_lst)).set_index('Date')

也许还有其他的方法。我解决这个问题的方法是首先处理字典,这样我们就可以得到所需数据帧输出的精确字典格式

def seperate(data):
    new_data = []
    for i in data:
        item = {}
        for j in i.keys():
            if j == "Date":
                item['Date'] = i['Date']
            else:
                state = list(i[j].keys())[0]
                item[j+'_ripe'] = state
                item[j+'_Quantity'] = i[j][state]
        new_data.append(item)
    return new_data
df = pd.DataFrame(seperate(fruit_inventory_lst)).set_index('Date')

谢谢,但输出需要是一个如上所示形式的多索引数据帧。也尽量避免显式for循环。您可以添加列列表来设置多索引的_index()。设置索引(['Date','col1','col2'])。上面提到的方法是蛮力方法谢谢,但是输出需要是上面所示形式的多索引数据帧。也尽量避免显式for循环。您可以添加列列表来设置多索引的_index()。设置索引(['Date','col1','col2'])。上述方法是蛮力方法