在熊猫中使用groupedby进行自定义数据框排序

时间:2018-07-25 23:26:15

标签: python pandas

我是python的新手,并且有一个数据框表:

     I    J   GAI         F
0   660  433  6016  0.000844
1   660  433  6020  0.888889
2   660  434  6016  0.010041
3   661  433  6016  0.021373

我想对此进行格式化,以使输出看起来像这样:

660: {433: [[6016,0.000844]], [[6020,0.888889]],
      434: [[6016,0.010041]]}
661: {433: [[6016,0.021373]]}

从本质上讲,应该将输出按I和J分组,然后编写相应的GAI / F组合。

我使用了df.groupedby(['I','J'])并获得了以下内容,但并不十分接近:

((660, 433),      I    J   GAI         F
0  660  433  6016  0.000844
1  660  433  6020  0.888889)
((660, 434),      I    J   GAI         F
2  660  434  6016  0.010041)
((661, 433),      I    J   GAI         F
3  661  433  6016  0.021373)

有人可以快速解决我的问题吗?我整天都在网上打猎,没有运气。

2 个答案:

答案 0 :(得分:0)

IIUC,您可以使用嵌套的defaultdict

from collections import defaultdict
x = defaultdict(lambda: defaultdict(list))

for d in df.groupby(['I', 'J'], as_index=False).agg(list).to_dict('r'):
    x[d['I']][d['J']].append(list(zip(d['GAI'], d['F'])))

如果需要,可以在最后转换回dict

x = {k: dict(v) for k, v in x.items()}

{660: {433: [[(6016, 0.0008439999999999999), (6020, 0.8888889999999999)]],
       434: [[(6016, 0.010041)]]},
 661: {433: [[(6016, 0.021373)]]}}

答案 1 :(得分:0)

通过使用groupbyto_dict

df.groupby('I').apply(lambda x : x.groupby('J')[['GAI','F']].apply(lambda x : x.values.tolist()).to_dict()).to_dict()
Out[461]: 
{660: {433: [[6016.0, 0.0008439999999999999], [6020.0, 0.8888889999999999]],
  434: [[6016.0, 0.010041]]},
 661: {433: [[6016.0, 0.021373]]}}