如何将关联的相邻熊猫数据框数据导出到字典中? [复制]
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]
?你试过groupby
和to_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)
【讨论】:
以上是关于如何将关联的相邻熊猫数据框数据导出到字典中? [复制]的主要内容,如果未能解决你的问题,请参考以下文章