如何将Pandas DataFrame指定列转为字典列表并按col1分组存入新列
基于col1合并DataFrame生成包含字典列表的列
原始DataFrame
col1 col2 col3 0 1 a W 1 1 b X 2 2 c Y 3 2 d Z
目标格式
col1 col2 col3 dict_col 0 1 a W [{'col2': 'a', 'col3': 'W'}, {'col2': 'b', 'col3': 'X'}] 1 2 c Y [{'col2': 'c', 'col3': 'Y'}, {'col2': 'd', 'col3': 'Z'}]
尝试的代码
import pandas as pd data = { 'col1': [1, 1, 2, 2], 'col2': ['a', 'b', 'c', 'd'], 'col3': ['W', 'X', 'Y', 'Z']} df = pd.DataFrame(data) print(df) cols_to_use = ['col2','col3'] df['dict_col'] = df[cols_to_use].apply( lambda x: {'col2': x['col2'], 'col3': x['col3']}, axis=1) print(df)
解决方案
你已经完成了生成每行字典的步骤,接下来只需要按col1分组聚合字典列表,再处理成目标格式即可,这里提供两种简洁实现方式:
方式一:分组聚合后合并去重
import pandas as pd data = { 'col1': [1, 1, 2, 2], 'col2': ['a', 'b', 'c', 'd'], 'col3': ['W', 'X', 'Y', 'Z']} df = pd.DataFrame(data) # 生成每行的字典,用to_dict更简洁通用 cols_to_use = ['col2','col3'] df['dict_col'] = df[cols_to_use].apply(lambda x: x.to_dict(), axis=1) # 按col1分组,聚合得到每个组的字典列表 grouped_dict = df.groupby('col1')['dict_col'].agg(list).reset_index() # 合并回原DataFrame,保留每个col1的第一行 result = df.merge(grouped_dict, on='col1', suffixes=('', '_group')) result = result.drop_duplicates(subset='col1').drop(columns='dict_col').rename(columns={'dict_col_group': 'dict_col'}) print(result)
方式二:用transform广播后去重
import pandas as pd data = { 'col1': [1, 1, 2, 2], 'col2': ['a', 'b', 'c', 'd'], 'col3': ['W', 'X', 'Y', 'Z']} df = pd.DataFrame(data) cols_to_use = ['col2','col3'] df['dict_col'] = df[cols_to_use].apply(lambda x: x.to_dict(), axis=1) # 用transform将分组后的字典列表赋值给组内每一行 df['dict_col'] = df.groupby('col1')['dict_col'].transform(list) # 去重,保留每个col1的第一行并重置索引 result = df.drop_duplicates(subset='col1').reset_index(drop=True) print(result)
说明
x.to_dict()替代手动构造字典,当列名变化时无需修改代码,更通用groupby.transform(list)可以把每个分组的字典列表批量赋值给组内所有行,省去合并步骤drop_duplicates(subset='col1')确保每个col1只保留一行,符合目标格式要求
内容的提问来源于stack exchange,提问作者snn
相关产品推荐
相关产品推荐

