将数据框转换为嵌套字典

时间:2019-08-12 11:51:55

标签: python pandas dataframe dictionary

我正在尝试将数据框转换为嵌套字典,但到目前为止没有成功。 我的数据框看起来像:

    _id                     date        predicted_date  code    type    predicted_value
5d223332216e3b4d587204db    2010-12-31  2011-12-31      70      delta   140
5d223332216e3b4d587204db    2016-12-31  2017-12-31      70      delta   360
5d223506216e3b4d587204dc    2008-12-31  2009-12-31      70      delta   40
5d223506216e3b4d587204dc    2009-12-31  2010-12-31      70      delta   55
5d223506216e3b4d587204dc    2010-12-31  2011-12-31      70      delta   70

我想要这样的字典:

    {
        "_id":"5d223332216e3b4d587204db",
        "delta":[
            {
                "date":2010-12-31,
                "data":{
                    "70":140
                }
            },
            {
                "date":2016-12-31,
                "data":{
                    "70":360
                }
            }
        ]   
    },
    {
        "_id":"5d223506216e3b4d587204dc",
        "delta":[
            {
                "date":2008-12-31,
                "data":{
                    "70":40
                }
            },
            {
                "date":2009-12-31,
                "data":{
                    "70":55
                }
            },
            {
                "date":2010-12-31,
                "data":{
                    "70":70
                }
            }
        ]   
    }

我尝试使用groupby(),apply(),lambda函数,to_dict()...我没有得到预期的结果。

有需要帮助吗?

非常感谢

西蒙(Simon)

1 个答案:

答案 0 :(得分:0)

您可以混合使用groupby和列表理解。您还可以将解析分解为较小的函数,然后将其放入类中。

class Converter:
    """ convert a DataFrame to nested dict structure"""

    @staticmethod
    def _row_to_dict(row):
        return {  
            "date": row.date,
            "data": {
                str(row.code): row.predicted_value
            }
        }

    @staticmethod
    def _group_to_dict(_id, group):
        return {
            "_id": _id,
            "delta": [Converter._row_to_dict(row) for _, row in group.iterrows()]
        }

    @staticmethod
    def to_dict(df):
        return [
            Converter._group_to_dict(_id, group) 
            for _id, group in df.groupby('_id')
        ]

Converter.to_dict(df)  

输出:

[{'_id': '5d223332216e3b4d587204db',
  'delta': [{'data': {'70': 140}, 'date': '2010-12-31'},
   {'data': {'70': 360}, 'date': '2016-12-31'}]},
 {'_id': '5d223506216e3b4d587204dc',
  'delta': [{'data': {'70': 40}, 'date': '2008-12-31'},
   {'data': {'70': 55}, 'date': '2009-12-31'},
   {'data': {'70': 70}, 'date': '2010-12-31'}]}]