Pandas列表列处理:将连续数字替换为‘最小值-最大值’格式
处理Pandas列表列的连续数字合并
核心思路
先写一个处理单个列表的函数,把列表里的元素分成数字型和非数字型两类:
- 对数字型元素,按数值排序后找出连续序列,把连续序列合并成
"起始字符串-结束字符串"的格式 - 非数字型元素直接保留
最后把处理后的数字序列和非数字元素合并成新列表,再用apply把函数批量应用到DataFrame的列上。
代码实现
import pandas as pd def merge_continuous_numbers(lst): # 分离数字项和非数字项 num_items = [] non_num_items = [] for item in lst: try: # 尝试转换为整数,同时记录原字符串和对应数值 num = int(item) num_items.append((num, item)) except ValueError: non_num_items.append(item) # 按数值排序数字项 num_items.sort(key=lambda x: x[0]) merged_num_strings = [] if num_items: # 初始化第一个连续组 current_group = [num_items[0]] for num, item in num_items[1:]: # 检查当前数值和组内最后一个数值是否连续(差值为1) if num == current_group[-1][0] + 1: current_group.append((num, item)) else: # 处理当前组:单元素保留原字符串,多元素拼接首尾 if len(current_group) == 1: merged_num_strings.append(current_group[0][1]) else: merged_num_strings.append(f"{current_group[0][1]}-{current_group[-1][1]}") current_group = [(num, item)] # 处理最后一个剩余组 if len(current_group) == 1: merged_num_strings.append(current_group[0][1]) else: merged_num_strings.append(f"{current_group[0][1]}-{current_group[-1][1]}") # 合并处理后的数字项和非数字项 return merged_num_strings + non_num_items # 测试用DataFrame df = pd.DataFrame({ 'field1': [ ['01', '02', '03', '04', 'Other'], ['-01', '00', '01', '06', '07', '08', '09'], ['01', '06', '07', '08', '09'], [] ] }) # 批量处理field1列 df['field1'] = df['field1'].apply(merge_continuous_numbers) print(df)
代码说明
- 元素分离:通过
try-except判断元素是否可转为整数,精准区分数字和非数字项 - 排序分组:数字项按数值排序后,遍历识别连续数值组(相邻数值差1即视为连续)
- 组合并规则:单元素组直接保留原字符串,多元素组用首尾原字符串拼接成范围格式
- 批量应用:用
apply将处理函数批量作用于整个DataFrame列,完成转换
运行后输出结果与需求完全匹配:
0 ['01-04', 'Other'] 1 ['-01-01', '06-09'] 2 ['01', '06-09'] 3 []
内容的提问来源于stack exchange,提问作者kunshabba
相关产品推荐
相关产品推荐

