基于多条件修改Pandas DataFrame中number列值的实现方案
解决Pandas DataFrame中文件number冲突的修正方案
核心思路
先将应共享number的文件归为同一组(同名文件、通过Replacing: 关联的文件),再按顺序检查分组的number,若当前分组与前一分组number重复,则将当前及后续分组的number依次递增修正。
步骤实现代码
import pandas as pd import re # 初始化示例DataFrame df_test = pd.DataFrame(data=None, columns=['file','comment','number']) df_test.file = ['file_1', 'file_1', 'file_1_v2', 'file_2', 'file_2', 'file_3', 'file_4', 'file_4_v2', 'file_5'] df_test.comment = ['none: 2', 'old', 'Replacing: file_1', 'v1', 'v2', 'none', 'old', 'Replacing: file_4', 'none'] df_test.number = [12, 12, 12, 13, 13, 13, 14, 14, 15] # 1. 生成分组键:将应共享number的文件归为同一组 def get_group_key(row): # 处理Replacing开头的注释,关联到被替换的文件 if row['comment'].startswith('Replacing: '): return row['comment'].replace('Replacing: ', '') # 处理带版本后缀的文件名,提取基础文件名(如file_1_v2 → file_1) else: return re.sub(r'_v\d+$', '', row['file']) df_test['group_key'] = df_test.apply(get_group_key, axis=1) # 2. 获取分组的出现顺序及原始number映射 # 按文件首次出现的顺序保留分组 groups_in_order = df_test['group_key'].drop_duplicates().tolist() # 每个分组对应的原始number(取组内第一个即可,因为同组原number一致) group_original_num = df_test.groupby('group_key')['number'].first().to_dict() # 3. 按顺序修正分组的number,解决冲突 adjusted_group_num = {} last_valid_num = None for group in groups_in_order: original_num = group_original_num[group] if last_valid_num is None: # 第一个分组直接用原始number adjusted_group_num[group] = original_num last_valid_num = original_num else: if original_num <= last_valid_num: # 当前分组number与前一个重复或更小,递增修正 new_num = last_valid_num + 1 adjusted_group_num[group] = new_num last_valid_num = new_num else: # 当前分组number合法,直接保留 adjusted_group_num[group] = original_num last_valid_num = original_num # 4. 将修正后的number映射回原DataFrame df_test['corrected_number'] = df_test['group_key'].map(adjusted_group_num) # 查看结果 print(df_test[['file', 'comment', 'number', 'corrected_number']])
输出结果
file comment number corrected_number 0 file_1 none: 2 12 12 1 file_1 old 12 12 2 file_1_v2 Replacing: file_1 12 12 3 file_2 v1 13 13 4 file_2 v2 13 13 5 file_3 none 13 14 6 file_4 old 14 15 7 file_4_v2 Replacing: file_4 14 15 8 file_5 none 15 16
关键细节说明
- 分组规则:通过正则去掉文件名的版本后缀(如
_v2),同时将Replacing: X的文件关联到X所在组,确保同属一个逻辑文件的不同版本共享number。 - 冲突修正:按分组的出现顺序遍历,维护上一个合法的number,若当前分组的原始number不大于上一个,则递增修正,保证后续所有分组的number连续且唯一。
- 通用性:该方案支持任意长度的DataFrame,只要符合分组规则即可自动修正number冲突。
内容的提问来源于stack exchange,提问作者Marcus K.
相关产品推荐
相关产品推荐

