如何将关联的相邻熊猫数据框数据导出到字典中? [复制]

Posted

技术标签:

【中文标题】如何将关联的相邻熊猫数据框数据导出到字典中? [复制]【英文标题】:How to export associated adjacent pandas dataframe data into a dictionary? [duplicate] 【发布时间】:2019-11-13 08:24:31 【问题描述】:

我想将以下样式的数据框放入字典中。

输入:

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

这确实适当地分离了所有数据,并在最后尝试将它们放在一起。我希望你能像这样制作一个超级嵌套的字典,但它完全失败了(事实证明这不是字典的工作方式,不幸的是 lmao)。

您如何产生所需的输出以产生相同的结果(也许还有更短的排序代码)?

谢谢!

【问题讨论】:

你真的想要字符串['1 + 2'] 还是结果[1 + 2],又名[3] 输出?或者您是否正在尝试获取值列表[1,2]?你试过groupbyto_dict(或to_json)吗? @G.Anderson 将例如 [1 + 2] 加在一起。在这种情况下,它们就像 2 个单独的销售。我还没有尝试过任何一种(直到现在才真正了解它们)。 【参考方案1】:

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

    为数据中的所有“类别”设置索引,这些是输出字典中的键。 聚合索引以删除重复索引 生成输出字典。
import pprint
import numpy as np

def make_dict(ind_vals, d, v):
  """Accumulate index entries as keys in a dict."""
  p = d

  # Get handle on the last but one dict level and make nested dicts if they
  # are not present
  for ix in ind_vals[:-1]:
    # Replace with collection.OrderedDict if necessary.
    p = p.setdefault(ix, )

  # Set the actual value of interest.
  p[ind_vals[-1]] = v

# Set indices correctly.
df = df.set_index(['Market', 'Rep', 'Name', 'Date'])

# Group values so we don't have duplicate indices
df = df.groupby(level=df.index.names).apply(np.sum)

dct =   # Replace with collection.OrderedDict if necessary.
for idx, val in df.iterrows():
  make_dict(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

【讨论】:

非常感谢您发布此内容:) 我与另一个可能重复共享的问题是,没有真正描述为什么有效的原因。此外,数据要短得多,并且在列表理解与字典中。【参考方案2】:

遍历行+值应该可以工作。

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)

【讨论】:

以上是关于如何将关联的相邻熊猫数据框数据导出到字典中? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

字典列表中的熊猫数组

在熊猫数据框单元格中插入列表

字典中的字典到熊猫数据框

如何从字典列表中提取数据到熊猫数据框中?

如何将包含元组列表的字典中的字典转换为熊猫数据框

Python:将字典附加到熊猫数据框行