使用2级嵌套数组将dataframe转换为JSON

2024-09-27 21:33:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Python编程有点陌生。我有一个小小的要求,我需要以JSON格式列出给定两周内的所有客户及其金额。在

目前,我有一个这样的数据帧:

  FortNight      Amount     Customer    Parameter
  Apr-2FN-2018   339632.00    10992     CustomerSales
  Apr-2FN-2018   27282.00     10994     CustomerSales 
  Apr-2FN-2018   26353.00     10995     CustomerSales 
  Apr-2FN-2018   24797.00     11000     CustomerSales
  Apr-2FN-2018   21093.00     10990     CustomerSales

应为JSON:

^{pr2}$

我试过了:

dict(df.set_index('Parameter').groupby(level=0).apply(lambda  x : ast.literal_eval(x.to_json(orient = 'records', date_format = "iso"))))

它检索以下内容:

 [{'CustomerSales': 
[{'Customer': '10992', 'Amount': 339632.00, 'FortNight': 'Apr-2FN-2018'}, {'Customer': '10994', 'Amount': 27282.00, 'FortNight': 'Apr-2FN-2018'},{'Customer': '10995', 'Amount': 26353.00, 'FortNight': 'Apr-2FN-2018'},
{'Customer': '11000', 'Amount': 24797.00, 'FortNight': 'Apr-2FN-2018'},
{'Customer': '10990', 'Amount': 21093.00, 'FortNight': 'Apr-2FN-2018'}]}]

我也试过别的办法,但没有成功。欢迎任何帮助。 提前谢谢!在


Tags: 数据json客户parameter格式编程customer金额
1条回答
网友
1楼 · 发布于 2024-09-27 21:33:29

首先对Parameter两周的列进行分组,并对结果分组的行使用.to_dict()来生成最内部的字典:

details = df.groupby(['Parameter', 'FortNight']).apply(
    lambda r: r[['Customer', 'Amount']].to_dict(orient='records'))

这为您提供了一个在ParameterFortNight上具有多索引的序列,这些值是所有格式正确的列表,每个条目都有一个字典,其中包含Customer和{}列。如果需要转换值类型,请先对r[['Customer', 'Amount']]数据帧结果执行此操作,然后再对其调用to_dict()。在

然后,您可以unstack将序列放入一个数据帧中,为您提供一个嵌套参数->两周->详细信息结构;参数值变成列,每个客户/金额字典列表按两周编制索引:

^{pr2}$

如果你把它变成一本字典,你就会得到一本基本上正确的词典:

>>> pprint(grouped.unstack('Parameter').to_dict())
{'CustomerSales': {'Apr-2FN-2018': [{'Amount': 339632.0, 'Customer': '10992'},
                                    {'Amount': 27282.0, 'Customer': '10994'},
                                    {'Amount': 26353.0, 'Customer': '10995'},
                                    {'Amount': 24797.0, 'Customer': '11000'},
                                    {'Amount': 21093.0, 'Customer': '10990'}]}}

但是对于您的格式,您需要将每列中的值转换为{'FortNight': indexvalue, 'Details': value}映射的列表,然后将整个结构转换为字典:

output = nested.apply(lambda s: [
    {s.index.name: idx, 'Details': value}
    for idx, value in s.items()
]).to_dict('records')

这将给出您的最终输出:

>>> pprint(output)
[{'CustomerSales': {'Details': [{'Amount': 339632.0, 'Customer': '10992'},
                                {'Amount': 27282.0, 'Customer': '10994'},
                                {'Amount': 26353.0, 'Customer': '10995'},
                                {'Amount': 24797.0, 'Customer': '11000'},
                                {'Amount': 21093.0, 'Customer': '10990'}],
                    'FortNight': 'Apr-2FN-2018'}}]

如果需要JSON文档,请使用.to_json(orient='records'),而不是{}。在

组合成一个表达式:

df.groupby(['Parameter', 'FortNight']).apply(
        lambda r: r[['Customer', 'Amount']].to_dict(orient='records')
    ).unstack('Parameter').apply(lambda s: [
        {s.index.name: idx, 'Details': value}
        for idx, value in s.items()]
    ).to_json(orient='records')

相关问题 更多 >

    热门问题