Python pandas按列分组:分组列值仅显示一次并保留所有其余列
问题说明
现有如下结构的字典数据:
dict_ = [ {'key1': 'value1', 'key2': 'value2', 'key3': 'value3', 'key4': 'value4', 'key5': 'value5', 'nested_dicts' : [ {'nested_key1' : 'nested_val_1', 'nested_key2' : 'nested_val_2', 'nested_key3' : 'nested_val_3', 'nested_key4' : 'nested_val_4' }, {'nested_key1' : 'nested_val_5', 'nested_key2' : 'nested_val_6', 'nested_key3' : 'nested_val_7', 'nested_key4' : 'nested_val_8' } ]}, { 'key1': 'value6', 'key2': 'value7', 'key3': 'value8', 'key4': 'value9', 'key5': 'value10', 'nested_dicts' : [ {'nested_key1' : 'nested_val_9', 'nested_key2' : 'nested_val_10', 'nested_key3' : 'nested_val_11', 'nested_key4' : 'nested_val_12' }, {'nested_key1' : 'nested_val_9', 'nested_key2' : 'nested_val_10', 'nested_key3' : 'nested_val_11', 'nested_key4' : 'nested_val_12' } ]} ]
需要实现按值分组效果:外层分组字段(key1到key5)的相同值仅在同组第一行展示,嵌套字典的所有字段完整展开,预期展示格式如下:
key1 key2 key3 key4 key5 nested_key1 nested_key2 nested_key3 nested_key4 value1 value2 value3 value4 value5 nested_val_1 nested_val_2 nested_val_3 nested_val_4 nested_val_5 nested_val_6 nested_val_7 nested_val_8 value6 value7 value8 value9 value10 nested_val_9 nested_val_10 nested_val_11 nested_val_12 nested_val_13 nested_val_14 nested_val_15 nested_val_16
可使用groupby、MultiIndex或其他pandas函数实现。
实现代码
核心思路是先把嵌套结构扁平化展开为标准二维表,再按外层字段分组,把同组非首行的外层字段值替换为空即可,不需要复杂的多层索引。
import pandas as pd # 第一步:扁平化嵌套字典结构,生成一维行数据列表 flat_data = [] for outer_item in dict_: # 提取外层固定字段 outer_fields = {k: v for k, v in outer_item.items() if k != "nested_dicts"} # 遍历所有嵌套字典,和外层字段拼接为完整行 for nested_item in outer_item["nested_dicts"]: flat_data.append({**outer_fields, **nested_item}) # 转为基础DataFrame df = pd.DataFrame(flat_data) # 第二步:按外层5个字段分组,同组仅保留第一行的外层字段值,其余置空 group_cols = ["key1", "key2", "key3", "key4", "key5"] df[group_cols] = df.groupby(group_cols, as_index=False)[group_cols].transform( lambda x: [x.iloc[0]] + [""] * (len(x) - 1) ) # 打印输出,关闭索引展示 print(df.to_string(index=False))
输出说明
运行代码后得到的输出和预期格式完全一致:
key1 key2 key3 key4 key5 nested_key1 nested_key2 nested_key3 nested_key4 value1 value2 value3 value4 value5 nested_val_1 nested_val_2 nested_val_3 nested_val_4 nested_val_5 nested_val_6 nested_val_7 nested_val_8 value6 value7 value8 value9 value10 nested_val_9 nested_val_10 nested_val_11 nested_val_12 nested_val_9 nested_val_10 nested_val_11 nested_val_12
注:预期输出中第二组第二行的
nested_val_13`nested_val_16`为示例笔误,根据提供的原始字典数据,该行实际值为`nested_val_9`nested_val_12,替换原始字典对应值即可得到目标展示内容。
内容的提问来源于stack exchange,提问作者user11004963
相关产品推荐
相关产品推荐

