Python Pandas技术求助:统计列表重复项并计算重复项差值
解决思路与实现代码
核心步骤拆解
要实现你需要的重复项统计与Delta计算,分3步即可完成:
- 记录每个数字的所有出现位置:遍历原始列表,用字典存储每个数字对应的所有索引位置,这是后续统计的基础。
- 生成基础统计项:对每个目标数字(比如你示例中的0-9),计算出现次数(total)、首次出现位置(first-occurence)。
- 计算Delta值:根据需求(相邻出现位置差值/与首次出现位置的差值)生成对应的Delta列,最后整理成目标格式的DataFrame。
代码实现
假设你的原始列表是 nums = [1,9,1,3,0,3,6,0,2,0](对应你示例左侧的索引与值),代码如下:
from collections import defaultdict import pandas as pd # 原始列表 nums = [1,9,1,3,0,3,6,0,2,0] # 1. 收集每个数字的所有出现索引 index_map = defaultdict(list) for idx, num in enumerate(nums): index_map[num].append(idx) # 2. 构建每行的统计数据 result_rows = [] # 覆盖数字0-9(可根据需求调整范围) for target_num in range(10): positions = index_map.get(target_num, []) count = len(positions) first_pos = positions[0] if count > 0 else None # 计算Delta:这里以「后续出现位置 - 首次出现位置」为例,若要相邻差值可改用 positions[i] - positions[i-1] deltas = [pos - first_pos for pos in positions[1:]] if count > 1 else [] # 组装行数据 row = { 'numbers': target_num, 'total': count if count > 0 else 0, 'first-occurence': first_pos if count > 0 else '' } # 添加Delta列 for i, delta_val in enumerate(deltas, 1): row[f'Delta_{i}'] = delta_val result_rows.append(row) # 3. 生成DataFrame并格式化空值 df = pd.DataFrame(result_rows).fillna('') # 打印结果(和你要的布局一致) print(df.to_string(index=False))
关键细节说明
- Delta的灵活计算:如果需要的是相邻出现位置的差值,把Delta计算部分改成
deltas = [positions[i] - positions[i-1] for i in range(1, len(positions))]即可。 - 空值填充:用
fillna('')把无数据的位置设为空字符串,和你示例的格式匹配。 - 目标数字范围:如果不需要覆盖0-9,只需调整
range(10)为你需要的数字范围即可。
内容的提问来源于stack exchange,提问作者Oily13
相关产品推荐
相关产品推荐

