来自数据框的嵌套字典,内部字典包含熊猫系列作为值

Posted

技术标签:

【中文标题】来自数据框的嵌套字典,内部字典包含熊猫系列作为值【英文标题】:Nested Dictionary from dataframe with inner dictionary containing a pandas series as the value 【发布时间】:2021-10-22 21:52:51 【问题描述】:

我在尝试创建嵌套字典时遇到问题,其中内部嵌套使用一系列值。

这是一个简单的数据框:

import pandas as pd
import random

catGrpAll = ['Category_A']*3 + ['Category_B']*3
catGrpAll = catGrpAll*4
codeGrpAll = ['code1','code2','code3']
codeGrpAll = codeGrpAll*8
dateGrpAll = [pd.to_datetime('2021-03-31')]*6 + [pd.to_datetime('2021-04-30')]*6 +\
             [pd.to_datetime('2021-05-31')]*6 + [pd.to_datetime('2021-06-30')]*6

random.seed(0)
numAll = [ random.randint(100, 5000) for _ in range(24)]


df = pd.DataFrame(data='Category':catGrpAll,
                        'Code':codeGrpAll,
                        'Time':dateGrpAll,
                        'Amount':numAll)                    
del catGrpAll,codeGrpAll,dateGrpAll,numAll



 #   Column    Non-Null Count  Dtype         
---  ------    --------------  -----         
 0   Category  24 non-null     object        
 1   Code      24 non-null     object        
 2   Time      24 non-null     datetime64[ns]
 3   Amount    24 non-null     int64 

df.head()
Out[294]: 
     Category   Code       Time  Amount
0  Category_A  code1 2021-03-31    3255
1  Category_A  code2 2021-03-31    3545
2  Category_A  code3 2021-03-31     431
3  Category_B  code1 2021-03-31    2221
4  Category_B  code2 2021-03-31    4288

我希望得到这样的结果: 第一个键值对将是类别代码 内部字典是代码系列

nested_dict =  
       'Category_A': [
              'code1': Series(Time/Amount),
               'code2': Series(Time/Amount),
               'code2': Series(Time/Amount) 
        ],
       'Category_B': [
              'code1': Series(Time/Amount),
               'code2': Series(Time/Amount),
               'code2': Series(Time/Amount) 
        ]
       

任何帮助将不胜感激

########################已更新##################### ################## 这是我希望字典看起来如何但想知道是否有办法避免循环的示例?

data = 
category = df.Category.unique()
code = df.Code.unique()

for i in category:
    data[i] = 
    for j in code:
        data[i][j] = []   


for i in category:
    for j in code:
        data[i][j] = df[(df.Category == i) & (df.Code == j)]
        data[i][j].index = data[i][j]['Time']
        data[i][j] = data[i][j]['Amount']

【问题讨论】:

【参考方案1】:

我没有看到任何提供您想要的输出的内置函数。最接近的是 df.to_records(orient='index')

您可以手动构建结果字典:

from collections import defaultdict

result = defaultdict(list)
for category, group in df.groupby('Category'):
    result[category].append(
        code: subgroup['Time'].to_list()
        for code, subgroup in group.groupby('Code')
    )

【讨论】:

以上是关于来自数据框的嵌套字典,内部字典包含熊猫系列作为值的主要内容,如果未能解决你的问题,请参考以下文章

序列化包含熊猫数据框的字典(Python)

如何使用熊猫规范化来自excel文件的嵌套字典数据

来自数据框的嵌套字典,带有循环列表

如何按列绘制数据框的多个字典?蟒蛇熊猫

从熊猫数据框中提取嵌套字典

融化包含字典列的熊猫数据框,以便字典值也被融化