在python中使用groupby规范JSON格式

iovurdzv  于 2023-10-21  发布在  Python
关注(0)|答案(2)|浏览(102)

我有一个JSON的列表,我需要分组的'天'字段和格式。下面是一个数据的例子,以及最终的输出应该是什么样子。

  1. data = [{'info': {'area': 'USA', 'other': 'cat'}, 'day': '1-1-2012', 'num': 12},
  2. {'info': {'area': 'KSA', 'other': 'bat'}, 'day': '1-1-2012', 'num': 52},
  3. {'info': {'area': 'KSA', 'other': 'fat'}, 'day': '4-3-2012', 'num': 34},]

所需输出应为:

  1. [{'1-1-2012': {'area' : {'USA', 'KSA'}, 'num': {12, 52}}, '4-3-2012': {'area': {'KSA'}, 'num': {34}}}]

我尝试使用pd.json_normmalize()将整个列表首先转换为一个嵌套框架,但我相信有一种更简单的方法可以实现上述输出。
谢谢你,谢谢

slhcrj9b

slhcrj9b1#

假设你从data创建的一个框架开始,你可以提取面积值,groupby天,然后转换回JSON:

  1. df = pd.DataFrame(data)
  2. out = (df
  3. .assign(area=df['info'].apply(lambda d:d['area']))
  4. .drop('info',axis=1)
  5. .groupby('day')
  6. .agg(list)
  7. .to_json(orient='index')
  8. )

示例数据的输出:

  1. '{"1-1-2012":{"num":[12,52],"area":["USA","KSA"]},"4-3-2012":{"num":[34],"area":["KSA"]}}'

请注意,如果您实际想要的输出是一个包含值集的字典,您可以将聚合更改为set,并将对to_json的调用替换为to_dict

  1. out = (df
  2. .assign(area=df['info'].apply(lambda d:d['area']))
  3. .drop('info',axis=1)
  4. .groupby('day')
  5. .agg(set)
  6. .to_dict(orient='index')
  7. )

输出量:

  1. {
  2. '1-1-2012': {
  3. 'num': {12, 52},
  4. 'area': {'USA', 'KSA'}
  5. },
  6. '4-3-2012': {
  7. 'num': {34},
  8. 'area': {'KSA'}
  9. }
  10. }
展开查看全部
j2datikz

j2datikz2#

我认为你想要的数据结构可能在某些基本方面是错误的,但是为了论证的目的,假设这种有损转换 * 是 * 你想要的,你可以这样做:

  1. data = [{'info': {'area': 'USA', 'other': 'cat'}, 'day': '1-1-2012', 'num': 12},
  2. {'info': {'area': 'KSA', 'other': 'bat'}, 'day': '1-1-2012', 'num': 52},
  3. {'info': {'area': 'KSA', 'other': 'fat'}, 'day': '4-3-2012', 'num': 34},]
  4. result = {}
  5. for d in data:
  6. day = d['day']
  7. row = result.setdefault(day, {'area': set(), 'num': set()})
  8. row['area'].add(d['info']['area'])
  9. row['num'].add(d['num'])

其给出:

  1. >>> result
  2. {'1-1-2012': {'area': {'USA', 'KSA'}, 'num': {12, 52}}, '4-3-2012': {'area': {'KSA'}, 'num': {34}}}
展开查看全部

相关问题