数据帧到字典的分组和键/值是其他列

时间:2020-08-06 00:51:36

标签: python pandas

回到我的bs,朋友们。我有一个这样的数据框:

+-------+--------------------------+------+-------+------+
| index |                specialty | code | count | rank |
+-------+--------------------------+------+-------+------+
| 19    | Colon and Rectal Surgery | 1557 | 36    | 5.0  |
+-------+--------------------------+------+-------+------+
| 22    | Surgical Oncology        | 1557 | 22    | 14.0 |
+-------+--------------------------+------+-------+------+
| 147   | Hematology               | 2057 | 383   | 13.0 |
+-------+--------------------------+------+-------+------+
| 753   | Oncology                 | 1578 | 74    | 15.0 |
+-------+--------------------------+------+-------+------+
| 1089  | Dental General Practice  | 1257 | 6     | 2.5  |
+-------+--------------------------+------+-------+------+

每个专业X都有多个条目-例如,我具有专业X的代码数和排名,最高为25。

我正在尝试使用lamba函数按专业分组,但我不知道如何将列添加为键/值并创建字典列表,而不仅仅是一个巨大的字典。

d = (df2.groupby('specialty').apply(lambda x: dict(zip(x['code'], x['Rank']))).to_dict())

print(d)

{'Acute Care Hospital': {
    1562: 8.0, 
    1554: 11.0, 
    6095: 8.0, 
    119114: 1.0, 
    119117: 5.5, 
    284051: 4.0, 
    562577: 11.0, 
    582646: 8.0, 
    1631305: 2.0, 
    1641114: 5.5, 
    1751592: 3.0, 
    1873207: 11.0
}

我如何像这样保留列作为键,并将其作为每个专业的列表:

[
    {'specialty': Acute Care Hospital', 
    [
        {'code': 1562, 'rank': 8.0, 
        'code': 1554, 'rank' :11.0, 
        'code': 6095, 'rank': 8.0, 
        'code': 119114, 'rank' 1.0, 
        'code': 119117, 'rank': 5.5, 
        'code': 284051, 'rank': 4.0, 
        'code': 562577, 'rank': 11.0, 
        'code': 582646, 'rank' 8.0, 
        'code': 1631305, 'rank': 2.0, 
        'code': 1641114, 'rank': 5.5, 
        'code': 1751592, 'rank': 3.0, 
        'code': 1873207, 'rank': 11.0}
    ]
    }
]

1 个答案:

答案 0 :(得分:1)

您发布的结果将不起作用,因为它包含重复的键。以下解决方案可能是您所追求的,因为它可以使字典中的代码等级对可调用。

这将在主级别专长下创建另一个词典级别,其中代码和等级对在数组中的同一索引上:

df.groupby('specialty').apply(lambda x: {'code':x['code'].values,'Rank':x['Rank'].values}).to_dict()

或者下一个简单地从groupby获得结果并将其放在键code_rank_pair下:

df.groupby('specialty').apply(lambda x: {'code_rank_pair':x.loc[:,['code','Rank']]}).to_dict()