如何按comment列条件调整Pandas DataFrame的number列值
解决方案
步骤说明
- 转换数据类型:先将
number列从字符串转为整数,方便后续数值计算。 - 标记替换行:识别
comment列以Replacing:开头的行,这类行的number无需调整(已与被替换文件保持一致)。 - 计算偏移量:针对非替换行,统计每个
number值的重复出现次数,以此作为需要递增的偏移量。 - 生成最终编号:原始
number加上对应偏移量,得到符合要求的结果。
完整代码
import pandas as pd # 初始化测试数据 df_test = pd.DataFrame(data=None, columns=['file','comment','number']) df_test.file = ['file_1', 'file_1_v2', 'file_2', 'file_3', 'file_4', 'file_4_v2', 'file_5'] df_test.comment = ['old', 'Replacing: file_1', 'none', 'new: 3', 'maybe', 'Replacing: file_4', 'none'] df_test.number = df_test.number.astype(int) # 转换为整数类型 # 标记comment以'Replacing: '开头的行 is_replacing = df_test.comment.str.startswith('Replacing: ') # 计算非替换行的偏移量:每个number值累计出现次数减1 temp_non_replacing = df_test.loc[~is_replacing, 'number'].reset_index(drop=True) offsets = temp_non_replacing.groupby(temp_non_replacing).cumcount() # 将偏移量赋值回原DataFrame df_test['offset'] = 0 df_test.loc[~is_replacing, 'offset'] = offsets.values # 生成最终number列 df_test['final_number'] = df_test['number'] + df_test['offset'] # 查看结果 print(df_test['final_number'].tolist()) # 输出: [12, 12, 13, 14, 15, 15, 16]
代码解释
is_replacing掩码:快速筛选出无需调整的替换行,避免干扰后续计算。cumcount()方法:对每个分组内的行进行计数,重复出现的行会得到递增的计数,正好作为需要递增的偏移量(比如number=13在非替换行中第二次出现时,计数为1,所以13+1=14)。- 偏移量赋值:通过索引对齐将计算好的偏移量映射回原DataFrame,确保只有非替换行应用偏移。
内容的提问来源于stack exchange,提问作者Marcus K.
相关产品推荐
相关产品推荐

