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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 03:36:30