【问题标题】:Pandas: Looking to create a multiple nested dictionaryPandas:希望创建一个多重嵌套字典
【发布时间】:2022-01-19 02:58:28
【问题描述】:

这是我想要生成的内容:

{A: {1: [1,2], 2: [2,5]},
 B: {3: [1,4], 4: [7,8]}}

这是df:

id sub_id
A  1
A  2
B  3
B  4

我有以下数组:

[[1,2],
[2,5],
[1,4],
[7,8]]

到目前为止,我有以下代码:

sub_id_array_dict = dict(zip(df['sub_id'].to_list(), arrays))

这会产生以下字典:

{1: [1,2],
 2: [2,5],
 3: [1,4],
 4: [7,8]}

现在,我觉得我走错了路,因为我不知道如何将它提升到 id 级别。

任何帮助将不胜感激。

【问题讨论】:

  • 你的数据框中的字母是否真的有点?
  • 不,抱歉。更新

标签: python json pandas


【解决方案1】:

通过一个简单的循环,可以这样做:

from collections import defaultdict

sub_id_array_dict = defaultdict(dict)
for i, s, a in zip(df['id'].to_list(), df['sub_id'].to_list(), arrays):
    sub_id_array_dict[i][s] = a

【讨论】:

  • 这是一个更清晰的答案 +1。
  • 这太好了,谢谢!现在,我应该将其包含在我最初的问题中,但您认为此解决方案能否很好地扩展?我的实际数据集包含 600K id 和 100M sub_id。如果你愿意,我可以在一个新问题中提出这个问题。
  • @MadhavThaker,对于这样的数字,Python 中的循环如下所示是一种不好的方法。我认为这是不同的,所以你应该创建一个新问题。
  • 好的,会的,谢谢。
【解决方案2】:

你可以使用pivot:

df['col'] = your_array
out = {k: {kk:vv for kk,vv in v.items() if vv is not np.nan} for k,v in df.pivot("sub_id","id",'col').to_dict().items()}

您也可以使用dict.setdefault 完成相同的工作:

out = {}
for i, j, l in zip(df['id'].to_list(), df['sub_id'].to_list(), your_array):
    out.setdefault(i, {}).setdefault(j, {})
    out[i][j] = l

输出:

{'A': {1: [1, 2], 2: [2, 5]}, 'B': {3: [1, 4], 4: [7, 8]}}

【讨论】:

    猜你喜欢
    • 2022-01-19
    • 2022-01-22
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多