You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于多条件修改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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 15:50:42