Python 使用pandas中的groupedby自定义数据帧排序

Python 使用pandas中的groupedby自定义数据帧排序,python,pandas,Python,Pandas,我是python新手,我有一个dataframe表: 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:

我是python新手,我有一个dataframe表:

     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)

有人能快速解决我的问题吗?我一整天都在网上搜寻,却没有这样的运气。

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'])))
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]]}}
如果需要,可以在最后转换回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)]]}}

通过使用
groupby
来记录

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'])))
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]]}}