Python 如何将关联的数据帧数据导出到字典中?

Python 如何将关联的数据帧数据导出到字典中?,python,pandas,dictionary,nested,data-science,Python,Pandas,Dictionary,Nested,Data Science,我想将以下风格的数据帧放入字典中 输入: >>>import pandas as pd >>>df = pd.read_csv('file.csv') >>>print(df) Market Rep Name Date Amount 0 A1 B1 C1 D1 1 1 A1 B1 C1 D1 2 2 A1 B1 C1 D2 3 3 A1

我想将以下风格的数据帧放入字典中

输入:

>>>import pandas as pd

>>>df = pd.read_csv('file.csv')
>>>print(df)

   Market  Rep  Name  Date  Amount
0  A1      B1   C1    D1    1
1  A1      B1   C1    D1    2 
2  A1      B1   C1    D2    3
3  A1      B1   C1    D2    4
4  A1      B1   C2    D1    5
5  A1      B1   C2    D1    6
6  A1      B1   C2    D2    7
7  A1      B1   C2    D2    8
8  A1      B2   C3    D1    9
9  A1      B2   C3    D1    10
10 A1      B2   C3    D2    11
11 A1      B2   C3    D2    12
12 A2      B3   C4    D1    13
13 A2      B3   C4    D1    14
期望输出:


>>> print(associated_data)
{'A1': {'B1': {'C1': {'D1':[1 + 2],
                     {'D2':[3 + 4]},
               'C2': {'D1':[5 + 6],
                      'D2':[7 + 8]}}
       {'B2': {'C3': {'D1':[9 + 10],
                      'D2':[11 + 12]}}},
 'A2': {'B3': {'C4': {'D1':[13 + 14]}}}}
这可能不是组织和排序数据的最佳方式,因此我愿意提出建议

我尝试了一种方法,我希望它能起作用,通过大量的for循环,如下所示:

# Main function
for market in df['Market'].unique():
    market_data = self.df.loc[self.df['Market'] == market]
    associated_reps = market_data['Rep'].unique()

    # Repeat
    for rep in associated_reps:
        rep_data = market_data.loc[market_data['Rep'] == rep]
        associated_names = rep_data['Name'].unique()

        # Repeat
        for name in associated_names:
            name_data = rep_data.loc[rep_data['Name'] == name]
            associated_dates = name_data['Date'].unique()

            # Repeat
            for date in associated_dates:
                date_data = name_data.loc[name_data['Date'] == date]
                associated_amount = sum(date_data['Amount'].tolist())

                # Attempted solution code (total fail)
                breakdown[market][rep][name][date] = associated_amount
这会适当地分离所有数据,并在最后尝试将所有数据放在一起。我希望你能制作一个这样的超级嵌套dict,但它完全失败了(因为事实证明,dict不是这样工作的)

如何生成所需的输出以产生相同的结果(可能还需要更短的排序代码)


谢谢

遍历行+值应该可以工作

dict_values = {}
for idx, row in df.iterrows():
    A, B, C, D, Amount = row
    if A not in dict_values.keys():
        dict_values[A]={}
    if B not in dict_values[A].keys():
        dict_values[A][B]={}
    if C not in dict_values[A][B].keys():
        dict_values[A][B][C]={}
    if D not in dict_values[A][B][C].keys():
        dict_values[A][B][C][D]=[Amount]
    else:
        dict_values[A][B][C][D].append(Amount)

发布了类似的问题,例如,请参阅,但下面的解决方案将起作用

  • 为数据中的所有“类别”设置索引,这些是输出目录中的键
  • 聚集索引以删除重复的索引
  • 生成输出指令
  • 导入pprint
    将numpy作为np导入
    def制造指令(指示值、d、v):
    “”“将索引项累积为目录中的键。”
    p=d
    #获取最后一个但只有一个dict级别的句柄,如果它们
    #他们不在场
    对于ind_vals[:-1]中的ix:
    #如有必要,替换为collection.OrderedDict。
    p=p.setdefault(ix,{})
    #设置感兴趣的实际值。
    p[ind_vals[-1]]=v
    #正确设置索引。
    df=df.set_索引(['Market','Rep','Name','Date'])
    #将值分组,这样我们就不会有重复的索引
    df=df.groupby(level=df.index.names).apply(np.sum)
    dct={}#必要时替换为collection.OrderedDict。
    对于idx,df.iterrows()中的val:
    制作目录(idx、dct、val.Amount)
    pprint.pprint(dct)
    #{'A1':{'B1':{'C1':{'D1':3,'D2':7},'C2':{'D1':11,'D2':15},
    #'B2':{'C3':{'D1':19,'D2':23},
    #'A2':{'B3':{'C4':{'D1':27}}
    
    您真的想要输出中的字符串
    ['1+2']
    还是结果
    [1+2]
    ,也称
    [3]
    ?或者您正在尝试获取值列表
    [1,2]
    ?您是否尝试过将
    groupby
    添加到dict
    (或
    添加到json
    )?@G.Anderson将示例[1+2]添加到一起。在这种情况下,他们就像两个独立的销售。我还没有尝试过任何一种(直到现在才真正了解它们)。非常感谢您发布此帖子:)我与另一个共享为可能的副本的问题是,没有真正说明为什么有效。此外,数据要短得多,并且在列表中,而不是在字典中。