首页 > 解决方案 > 将字典值的数据帧转换为多索引数据帧的最有效方法是什么?

问题描述

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

这是我目前的距离:

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 值)转换为多索引数据帧?最终数据框应采用下图所示的形式。我遇到的主要问题是如何正确构造数据,以便我可以将其输入到下面的多索引数据帧格式中(或者有没有办法直接转换上面的数据帧)。

fruits = ['Apple','Orange','Banana']
headers = ['Ripeness','Quantity']
columns =  pd.MultiIndex.from_product([fruits,headers])
df_m = pd.DataFrame(data=np.nan,columns=columns,index=[df.index[0]])
df_m.index.name = 'Date'

df_m >>>

            Apple                   Orange                  Banana
            Ripeness    Quantity    Ripeness    Quantity    Ripeness    Quantity
Date                        
2020-01-01  NaN         NaN         NaN         NaN         NaN         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

谢谢!...

标签: python-3.xpandasdataframedictionarymulti-index

解决方案


也许还有其他方法。我解决这个问题的方法是首先处理字典,因此,我们将为所需的 DataFrame 输出提供精确的字典格式

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')

输出


推荐阅读