将 python 数据帧转换为字典,然后转换为字符串

Converting python dataframe into dictionary and then into a string

我有一个名为 users_df 的数据框,看起来像这样

id first_name last_name signup_date
1 詹姆斯 史密斯 2021-01-01
2 马克 亚当斯 2021-03-02
3 玛丽 玫瑰 2021-05-03
users_df = pd.DataFrame([[1, 'James', 'Smith', '2021-01-01'], [2, 'Mark', 'Adams', '2021-03-02'],[3, 'Mary', 'Rose', '2021-05-03']], columns=['id', 'first_name','last_name', 'signup_date'])

我首先尝试将其转换成如下所示的字典:

user_dict = {
    "users": [
        {"id": 1, "user_fields": {"first_name": "James", "last_name": "Smith", "signup_date": "2021-01-01"}}, 
        {"id": 2, "user_fields": {"first_name": "Mark", "last_name": "Adams", "signup_date": "2021-03-02"}}, 
        {"id": 3, "user_fields": {"first_name": "Mary", "last_name": "Rose", "signup_date": "2021-05-03"}}
    ]
}

然后最后将其转换为字符串:

user_dict_string = '{"users": [{"id": 1, "user_fields": {"first_name": "James", "last_name": "Smith", "signup_date": "2021-01-01"}}, {"id": 2, "user_fields": {"first_name": "Mark", "last_name": "Adams", "signup_date": "2021-03-02"}}, {"id": 3, "user_fields": {"first_name": "Mary", "last_name": "Rose", "signup_date": "2021-05-03"}}]}'

我卡住的部分是将数据帧转换为字典,同时保留“id”部分(当我这样做时请参见下面的示例to_dict('index')),然后添加 "users" 列表和嵌套的 "user_fields" 部分。

我能找到的就是使用这个:

user_dict = user_list.to_dict('index')

但结果看起来像这样,这不是我想要的

{1: {'first_name': 'James', 'last_name': 'Smith', 'signup_date': '2021-01-01'}, 2: {'first_name': 'Mark', 'last_name': 'Adams', 'signup_date': '2021-03-02'}, 3: {'first_name': 'Mary', 'last_name': 'Rose', 'signup_date': '2021-05-03'}}

感谢任何帮助

我们可以使用字典理解来创建所需格式的记录

{'users': [{'id': d.pop('id'), 'user_fields': d} for d in users_df.to_dict('r')]}

{'users': [{'id': 1,
            'user_fields': {'first_name': 'James',
                            'last_name': 'Smith',
                            'signup_date': '2021-01-01'}},
           {'id': 2,
            'user_fields': {'first_name': 'Mark',
                            'last_name': 'Adams',
                            'signup_date': '2021-03-02'}},
           {'id': 3,
            'user_fields': {'first_name': 'Mary',
                            'last_name': 'Rose',
                            'signup_date': '2021-05-03'}}]}

您可以使用理解从

构建预期的结构
users_df = pd.DataFrame([[1, 'James', 'Smith', '2021-01-01'],
                         [2, 'Mark', 'Adams', '2021-03-02'],
                         [3, 'Mary', 'Rose', '2021-05-03']],
                        columns=['id', 'first_name','last_name', 'signup_date'])

您已经发现:

users_df.set_index('id').to_dict('index')

给出:

{1: {'first_name': 'James', 'last_name': 'Smith', 'signup_date': '2021-01-01'},
 2: {'first_name': 'Mark', 'last_name': 'Adams', 'signup_date': '2021-03-02'},
 3: {'first_name': 'Mary', 'last_name': 'Rose', 'signup_date': '2021-05-03'}}

只需添加一步:

user_dict = {'users': [{'id': k, 'user_fields': v}
               for k, v in users_df.set_index('id').to_dict('index')
               .items()]}

获得:

{'users': [{'id': 1,
            'user_fields': {'first_name': 'James',
                            'last_name': 'Smith',
                            'signup_date': '2021-01-01'}},
           {'id': 2,
            'user_fields': {'first_name': 'Mark',
                            'last_name': 'Adams',
                            'signup_date': '2021-03-02'}},
           {'id': 3,
            'user_fields': {'first_name': 'Mary',
                            'last_name': 'Rose',
                            'signup_date': '2021-05-03'}}]}

一个简单的 json.dumps 会将其转换为字符串...