以下是数据帧:

ID    area   data_info
a001   NY    [{color: 'Yellow', 'count': 3, 'weight': 5}, {color: 'Blue', 'count': 2, 'weight': 11} , {color: 'Red', 'count': 7, 'weight': 3}] 
a002   SF    [{color: 'Green', 'count': 1, 'weight': 14},{color: 'Yellow', 'count': 9, 'weight': 2}]
a003   NY    [{color: 'Blue', 'count': 5, 'weight': 6}, {color: 'Black', 'count': 2, 'weight': 15}]

具有相同区域的行将组合DATA_INFO中的信息,并基于相同的 colored颜色 键值聚合计数和权重.

预期结果:

ID a001和amp;a003具有相同的区域NY,因此DATA_INFO的值将合并并聚合到一行中.由于A001和A003在词典中的 colored颜色 为蓝色,因此它将汇总计数和权重的总和.

 area   data_info
  NY    [{color: 'Yellow', 'count': 3, 'weight': 5}, {color: '**Blue**', 'count': **7**, 'weight': **17**} , {color: 'Red', 'count': 7, 'weight': 3}, {color: 'Black', 'count': 2, 'weight': 15}] 
  SF    [{color: 'Green', 'count': 1, 'weight': 14},{color: 'Yellow', 'count': 9, 'weight': 2}]

推荐答案

Assuming you have a valid data structure in 100 (list of dicts).

您可以使用pd.json_normalizedata_info列中提取数据:

# Create an index to allow merging the area column
idx = df.index.repeat(df['data_info'].str.len())

# Extract data and set the area column
dat = (pd.json_normalize(df['data_info'].explode())
         .assign(area=df.loc[idx, 'area'].values))

# Compute the sum
dat = dat.groupby(['color', 'area']).sum().reset_index('color')

# Create the expected output
out = (pd.DataFrame({'area': dat.index, 'data_info': dat.to_dict('records')})
         .groupby('area', as_index=False).agg(list))

输出:

>>> out
  area  data_info
0   NY  [{'color': 'Black', 'count': 2, 'weight': 15}, {'color': 'Blue', 'count': 7, 'weight': 17}, {'color': 'Red', 'count': 7, 'weight': 3}, {'color': 'Yellow', 'count': 3, 'weight': 5}]
1   SF  [{'color': 'Green', 'count': 1, 'weight': 14}, {'color': 'Yellow', 'count': 9, 'weight': 2}]

中间步骤

>>> (pd.json_normalize(df['data_info'].explode())
       .assign(area=df.loc[idx, 'area'].values))

    color  count  weight area
0  Yellow      3       5   NY
1    Blue      2      11   NY
2     Red      7       3   NY
3   Green      1      14   SF
4  Yellow      9       2   SF
5    Blue      5       6   NY
6   Black      2      15   NY

>>> dat.groupby(['color', 'area']).sum().reset_index('color')
       color  count  weight
area                       
NY     Black      2      15
NY      Blue      7      17
SF     Green      1      14
NY       Red      7       3
NY    Yellow      3       5
SF    Yellow      9       2

Python-3.x相关问答推荐

是否可以使用参数对Flask重定向?

安装grpcio时出现错误DeproationWarning:pkg_resource

为什么我无法在django中按月筛选事件?

如何使用正则表达式通过反向搜索从链接中获取特定文本

命名空间前缀无效

如何通过 python 使用 auth no priv 获取 SNMPv3?

类不继承时 super() 的用途

如何融化具有自定义名称的Pandas

将字典列表展平为数据框列

在初始化之前禁用`__setattr__`的干净方法

活动屏幕上的 PyQt4 中心窗口

如何在 Python 3 中通过 IP 获取 WhoIs 信息?

如何从同一文件夹中的模块导入功能?

如何调试垂死的 Jupyter Python3 内核?

在 Python 3 中调用 super() 的 4 种方法中的哪一种?

如何使用已打开并使用登录凭据登录的浏览器

没有名为urlparse的模块,但我没有使用 urlparse

Selenium Python - 处理没有这样的元素异常

如何使用等待表达式?

在 Python3 中根据消息日志(log)级别修改日志(log)消息格式