如何为Pandas DataFrame的调整行与插入行添加CSV导出标记
问题背景
我有如下Pandas DataFrame:
import pandas as pd df = pd.DataFrame() df['number'] = (651,651,651,4267,4267,4267,4267,4267,4267,4267,8806,8806,8806,6841,6841,6841,6841) df['name']=('Alex','Alex','Alex','Ankit','Ankit','Ankit','Ankit','Ankit','Ankit','Ankit','Abhishek','Abhishek','Abhishek','Blake','Blake','Blake','Blake') df['hours']=(8.25,7.5,7.5,7.5,14,12,15,11,6.5,14,15,15,13.5,8,8,8,8) df['loc']=('Nar','SCC','RSL','UNIT-C','UNIT-C','UNIT-C','UNIT-C','UNIT-C','UNIT-C','UNIT-C','UNI','UNI','UNI','UNKING','UNKING','UNKING','UNKING') print(df)
我已经实现了按number分组后,当个人累计工时达到38小时时,调整触发该行的工时数值,并插入一行承载剩余工时的逻辑,代码如下:
s = df.groupby('number')['hours'].cumsum() m = s.gt(38) idx = m.groupby(df['number']).idxmax() delta = s.groupby(df['number']).shift().rsub(38).fillna(s) out = df.loc[df.index.repeat((df.index.isin(idx)&m)+1)] out.loc[out.index.duplicated(keep='last'), 'hours'] = delta out.loc[out.index.duplicated(), 'hours'] -= delta print(out)
之后我用以下代码将结果导出为CSV:
out.to_csv('Output.csv', index = False)
需求
原本想在导出CSV时给调整行和插入行添加颜色高亮,但CSV不支持颜色,现在想找能给这两类行添加识别标记的方法。
可行的标记方法
1. 添加专门的标记列
新增一列(比如row_type),用明确值区分三类行:
- 原始未修改行:标记为
original - 被调整工时的原行:标记为
adjusted - 新增的剩余工时行:标记为
inserted
修改后的代码示例:
# 执行原有处理逻辑 s = df.groupby('number')['hours'].cumsum() m = s.gt(38) idx = m.groupby(df['number']).idxmax() delta = s.groupby(df['number']).shift().rsub(38).fillna(s) out = df.loc[df.index.repeat((df.index.isin(idx)&m)+1)] out.loc[out.index.duplicated(keep='last'), 'hours'] = delta out.loc[out.index.duplicated(), 'hours'] -= delta # 添加标记列 out['row_type'] = 'original' # 标记调整行(重复索引的第一个行) out.loc[out.index.duplicated(keep='last'), 'row_type'] = 'adjusted' # 标记插入行(重复索引的第二个行) out.loc[out.index.duplicated(keep='first'), 'row_type'] = 'inserted' # 导出CSV out.to_csv('Output.csv', index=False)
2. 用特殊字符标记现有列
如果不想新增列,可以在name或loc等列末尾添加特殊符号:
- 调整行:在
name后加* - 插入行:在
name后加+
示例代码:
# 执行原有处理逻辑(省略) # 标记调整行 out.loc[out.index.duplicated(keep='last'), 'name'] = out['name'] + '*' # 标记插入行 out.loc[out.index.duplicated(keep='first'), 'name'] = out['name'] + '+' out.to_csv('Output.csv', index=False)
3. 通过原始索引标记
保留原始索引并添加标记后缀,导出时可以清晰对应原数据行:
# 执行原有处理逻辑(省略) # 重置索引,保留原始索引值 out = out.reset_index(names='original_idx') # 给调整行加后缀 adjust_mask = out.duplicated(subset='original_idx', keep='last') out.loc[adjust_mask, 'original_idx'] = out['original_idx'].astype(str) + '_adjusted' # 给插入行加后缀 insert_mask = out.duplicated(subset='original_idx', keep='first') out.loc[insert_mask, 'original_idx'] = out['original_idx'].str.replace('_adjusted', '') + '_inserted' # 导出CSV out.to_csv('Output.csv', index=False)
内容的提问来源于stack exchange,提问作者ds882
相关产品推荐
相关产品推荐

