如何在Pandas中提取各行列表的独有元素并生成新列
在Pandas DataFrame中提取每行独有的列表元素
需求说明
给定一个每行存储列表数据的字典(可转为DataFrame),需要新增一列unique_values,其中每个元素是仅对应行存在、其他所有行均未出现的元素集合;若该行没有这类元素,则返回[None]。
输入示例
data = { 'object_1': [1, 3, 4, 5, 77], 'object_2': [1, 5, 100, 3, 4], 'object_3': [1, 3, 4, 5, 5], 'object_4': [1, 3, 5, 47, 48] }
实现步骤及代码
导入依赖并构造DataFrame
先将原始字典转为DataFrame,同时生成存储每行完整列表的elements列:import pandas as pd # 构造DataFrame,每行对应一个object df = pd.DataFrame.from_dict(data, orient='index', columns=['v1', 'v2', 'v3', 'v4', 'v5']) # 生成每行的元素列表 df['elements'] = df.apply(lambda row: row.tolist(), axis=1)统计元素的跨行出现次数
统计每个元素在多少行中出现(同一行内重复元素只算一次):# 把每行元素转为集合,避免同一行重复元素干扰统计 row_element_sets = df['elements'].apply(set) # 初始化统计字典 element_row_count = {} for elem_set in row_element_sets: for elem in elem_set: element_row_count[elem] = element_row_count.get(elem, 0) + 1提取每行独有的元素
遍历每行,筛选出仅在该行出现的元素,若无则填充[None]:df['unique_values'] = df['elements'].apply( lambda lst: [elem for elem in set(lst) if element_row_count[elem] == 1] or [None] )转换为示例格式的结果
若需要转回原始字典格式:final_data = {} # 还原原始object对应的列表 for idx, row in df.iterrows(): final_data[idx] = row['elements'] # 添加unique_values列 final_data['unique_values'] = df['unique_values'].tolist() print(final_data)
输出结果
{ 'object_1': [1, 3, 4, 5, 77], 'object_2': [1, 5, 100, 3, 4], 'object_3': [1, 3, 4, 5, 5], 'object_4': [1, 3, 5, 47, 48], 'unique_values': [[77], [100], [None], [47, 48]] }
内容的提问来源于stack exchange,提问作者Mr.Slow
相关产品推荐
相关产品推荐

