python-3.x - 将字典值的数据帧转换为多索引数据帧的最有效方法是什么?
问题描述
我有一个数据框(最初是从字典列表创建的),它现在最终在数据框的每个单元格中都有包含数据的字典。我想以最有效的方式将其转换为多索引数据框(如下图所示)。
这是我目前的距离:
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
谢谢!...
解决方案
也许还有其他方法。我解决这个问题的方法是首先处理字典,因此,我们将为所需的 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')
推荐阅读
- python - 如何构建我的 Django Web 抓取项目?
- java - 为 Firebase Firestore 加密数据
- text - 拆分文本脚本的问题
- vue.js - vue中的重复数据
- javascript - 在 HTML5 画布上绘制圆的 3 种方法示例
- git - `git ls-files --others`时如何列出空文件夹?
- django - 为什么我的托管 Django 应用程序在 URL 中显示我的用户名?
- php - 使用 PhpMailer 批准后如何向用户发送电子邮件
- php - 在 Symfony 4 中渲染导航栏时出现 TypeError
- sql - 添加两个包含整数值的变量