【问题标题】:convert pandas dataframe of multiple columns with NaN to a nested dictionary将具有 NaN 的多列熊猫数据框转换为嵌套字典
【发布时间】:2020-11-19 19:21:05
【问题描述】:
                         object_id                  time_id                      class         x       y
0  3db53411-c23b-49ec-8635-adc4e3ee2895  5G21A6P01L4100029:1570754223950071         NaN       NaN      NaN
1  3cea3cdc-883e-48d7-83de-e485da2e085a  5G21A6P01L4100029:1570754223950071        PERSON   528.868  2191.747
2  fc87a12f-a76a-4273-a712-6f56afc042c6  5G21A6P01L4100029:1570754223950071          CAR   512.238  2192.744
3  4edb4e32-0345-4f85-a4b1-e60903368fed  5G21A6S09K40039EX:1565470602550590          NaN      NaN       NaN
4  cd68a1d0-2470-4096-adb1-201017aadc9e  5G21A6S09K40039EX:1565470602550590         PERSON -1305.968 -2423.231

我有一个嵌套字典 detections,其架构如下

detections = defaultdict(dict)
detections[key:time_id][key:object_id] = {'class_text':... , 'x': ..., 'y': ...}

对于上述数据框detections 将是:

detections[5G21A6P01L4100029:1570754223950071] = 
{
`3db53411-c23b-49ec-8635-adc4e3ee2895`: {},
'3cea3cdc-883e-48d7-83de-e485da2e085a': {'class_text': 'PERSON', 'x': 528.8, 'y': 2191.7}, 
'fc87a12f-a76a-4273-a712-6f56afc042c6': {'class_text': 'CAR', 'x': 512.2, 'y': 2192.7}}
}

detections["5G21A6S09K40039EX:1565470602550590"] = 
{
`4edb4e32-0345-4f85-a4b1-e60903368fed`: {},
'cd68a1d0-2470-4096-adb1-201017aadc9e': {'class_text': 'PERSON', 'x': -1305.968, 'y': -2423.23}
}

当(classxy)的值为NaN时,detections为空值,否则为对应值。

感谢任何关于如何在不遍历每一行的情况下生成 detections 的评论?

【问题讨论】:

    标签: python pandas dataframe dictionary nested


    【解决方案1】:

    time_id 上使用groupby 并应用自定义合并函数merge_dicts 以根据预定义的要求将分组的数据框合并到字典中:

    def merge_dicts(s):
        s = s.set_index('object_id')[['class', 'x', 'y']]
        return s.agg(lambda x: {} if x.isna().all() else dict(**x), axis=1).to_dict()
    
    detections = df.groupby('time_id').apply(merge_dicts).to_dict()
    

    结果:

    print(detections)
    
    {
        '5G21A6P01L4100029: 1570754223950071': 
        { 
            '3db53411-c23b-49ec-8635-adc4e3ee2895': {},
            '3cea3cdc-883e-48d7-83de-e485da2e085a': {'class': 'PERSON', 'x': 528.868, 'y': 2191.7470000000003},
            'fc87a12f-a76a-4273-a712-6f56afc042c6': {'class': 'CAR', 'x': 512.238, 'y': 2192.744}
        },
        '5G21A6S09K40039EX: 1565470602550590': 
        {
            '4edb4e32-0345-4f85-a4b1-e60903368fed': {},
            'cd68a1d0-2470-4096-adb1-201017aadc9e': {'class': 'PERSON', 'x': -1305.968, 'y': -2423.231}
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-10
      • 2021-01-19
      • 2017-06-19
      • 2019-10-26
      • 2021-09-30
      • 2019-02-11
      • 2022-01-06
      • 1970-01-01
      相关资源
      最近更新 更多