我是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)
有人可以快速解决我的问题吗?我整天都在网上打猎,没有运气。
答案 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)
通过使用groupby
和to_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]]}}