拆分数据字典包含字典的列

时间:2018-12-13 06:04:24

标签: python pandas dictionary

我意识到我发布的第一个版本确实不清楚,并且不符合网站规则,对此我感到抱歉。我删除了前一个并使其更加清晰。

这是我的第一篇文章,我对问题进行了研究,但找不到解决方法。

实际上,我有一个这样的DataFrame(SecurityInfo列包含字典,我将在下面详细介绍)

  Rent_ID     UserId  Car_Id  Rent_Date     SecurityInfo
    0           1        2    2018/05/09     dict_1
    1           2        4    2018/05/10     dict_2
    2           3        6    2018/05/11     dict_3

下面您将看到字典的外观。每个单元格一本字典。

{
    "car_consumption": 99,
    "car_route_option": "None",
    "safetyEvents": [{
                  "latitude": 99.140763200350641,
                  "longitude": -9.6871865486956645,
                  "time": 1121,
                  "type": 3
             }, {
                  "latitude": 99.115982330953294,
                  "longitude": -9.5833240979286927,
                  "time": 1710,
                  "type": 1
             }, {
                  "latitude": 99.115982330953294,
                  "longitude": -9.5833240979286927,
                  "time": 1710,
                  "type": 2
    },
    "pollutant": {
        "trip": 8.0129999999999999,
        "nox": 44.960000000000001,
        "co": 28.300000000000001,
        "global": 8.7065000000000001
    },
    "ecoDriving": {
        "scoreAccel": 2.5,
        "score": 9.4000000000000004,
        "scoreMain": 3.1000000000000001
    }
}

您可以看到SafetyEvent键是一个嵌套键,其中还包含字典列表

我想获得这种输出

      Rent_ID     UserId  Car_Id  Rent_Date   Car_Consumption  car_route_option         SafetyEvent       trip   nox    co     global    scoreAccel    score    scoreMain
        0           1        2    2018/05/09      99                None           list1_of_SafetyEvent   
        1           2        4    2018/05/10      95                Good           list2_of_SafetyEvent 
        2           3        6    2018/05/11      96                 Bad           list3_of_SafetyEvent

我尝试使用下面的函数,但是仅当我传递仅包含一个字典的数据框时,它才起作用,它不接受数据框列作为参数

def unpack(df, column, fillna=None):


    ret = None  # Intitlisation retour
    if fillna is None:   # Si 
        ret = pd.concat([df, pd.DataFrame((d for idx, d in df[column].iteritems()))], axis=1)
        del ret[column]
    else:
        ret = pd.concat([df, pd.DataFrame((d for idx, d in df[column].iteritems())).fillna(fillna)], axis=1)
        del ret[column]
    return ret

我也尝试过,但是没有用

df_SafetyEvent = pd.DataFrame(df['SecurityInfo'].values.tolist(), index=df.index)

似乎我的词典没有被检测为词典,但是我检查了类型,实际上是。

谢谢您的帮助,如果我的帖子不合规,请告诉我,我会予以纠正。

0 个答案:

没有答案