繁体   English   中英

如何将 pandas dataframe 转换为嵌套字典或 json?

[英]How to convert pandas dataframe into nested dictionary or json?

我正在运行 Python 3.8 和 Pandas 0.19.2 并有一个 DataFrame 如下所示:

身份证号 姓名 数量 附加物
1234 A B C D 100 美元 洗车-$30
1234 A B C D 100 美元 维护-$70

我需要一个字典/JSON,如下所示:

[
    {
       'id_number': 1234,
       'name': 'ABCD',
       'amount': '$100',
       'addenda': [ 
                  {'payment_related_info': 'Car-wash-$30'}, 
                  {'payment_related_info': 'Maintenance-$70'}
                  ]
    }
]

我尝试使用 groupby 和 to_dict,但它不起作用。 有什么建议么? 预先感谢您的帮助。

只需通过在内部创建 dataframe 来应用 groupby 和聚合,如下所示:

data = {
    "id_number": [1234, 1234],
    "name": ["ABCD", "ABCD"],
    "amount": ["$100", "$100"],
    "addenda": ["Car-wash-$30", "Maintenance-$70"]
}
df = pd.DataFrame(data=data)

df.groupby(by=["id_number", "name", "amount"]) \
    .agg(lambda col: pd.DataFrame(data=col) \
         .rename(columns={"addenda": "payment_related_info"})) \
    .reset_index() \
    .to_json(orient="records")

这将返回您想要的结果!

如果我们向后工作,在使用 DataFrame 操作.to_dict()之前,您需要 DataFrame 将附录信息放在这样的单行中:

身份证号 姓名 数量 附加物
1234 A B C D 100 美元 [{payment_related_info:洗车-$30,payment_related_info:维护-$70}]

要到达这里,您可以对id_number, name, amount执行groupby ,然后应用 function 将该 groupby 的行折叠到字典列表中,其中每个键是字符串'payment_related_info'

def collapse_row(x):
    addenda_list = x["addenda"].to_list()
    last_row = x.iloc[-1]
    last_row["addenda"] = [{'payment_related_info':v} for v in addenda_list] 
    return last_row

grouped = df.groupby(["id_number","name","amount"]).apply(collapse_row).reset_index(drop=True)
grouped.to_dict(orient='records')

结果:

[
    {
       'id_number': 1234, 
       'name': 'ABCD', 
       'amount': '$100', 
       'addenda': [
                  {'payment_related_info': 'Car-wash-$30'},                                                            
                  {'payment_related_info': 'Maintenance-$70'}
                  ]
    }
]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM