如何处理表格中重复的Service Code行,保留指定记录?
按Service Code去重并保留指定优先级行的实现方法
原始表格(存在重复Service Code行):
Service Code Amount Flag1 Flag2 1111 8100 5 YES TOP 2222 8004 10 YES OTHER 2222 8004 10 YES TOP 3333 8502 2 NO OTHER 4444 1015 7 YES OTHER 4444 1015 7 NO OTHER 5555 7104 12 YES OTHER 5555 7104 12 YES OTHER目标:按Service Code去重,保留规则为:
- 同一Service Code下,优先保留Flag2为
TOP的行(如2222)- 无TOP时,优先保留Flag1为
YES的行(如4444)- 完全重复的行直接去重(如5555)
最终结果:Service Code Amount Flag1 Flag2 1111 8100 5 YES TOP 2222 8004 10 YES TOP 3333 8502 2 NO OTHER 4444 1015 7 YES OTHER 5555 7104 12 YES OTHER
方法1:Excel实现
- 步骤1:添加辅助列(比如E列),输入优先级赋值公式:
逻辑:Flag2为TOP的行优先级最高(赋值3),Flag1为YES的次之(赋值2),其余赋值1。=IF(D2="TOP",3,IF(C2="YES",2,1)) - 步骤2:选中所有数据(含表头),点击「数据」→「排序」,设置规则:
- 主要关键字:
Service Code,升序 - 次要关键字:
辅助列,降序
- 主要关键字:
- 步骤3:排序完成后,点击「数据」→「删除重复值」,仅勾选
Service Code列,确认后即可得到目标结果。
方法2:Python(Pandas)实现
- 代码示例(适配制表符分隔的文本/CSV):
import pandas as pd # 加载数据,按实际存储路径调整 df = pd.read_csv("your_data.txt", sep="\t") # 生成优先级列 df['priority'] = df.apply( lambda x: 3 if x['Flag2'] == 'TOP' else 2 if x['Flag1'] == 'YES' else 1, axis=1 ) # 按Service Code升序、优先级降序排序 df_sorted = df.sort_values(by=['Service Code', 'priority'], ascending=[True, False]) # 按Service Code去重,保留优先级最高的第一行 df_result = df_sorted.drop_duplicates(subset='Service Code', keep='first').drop(columns='priority') # 输出结果,可保存为文件 print(df_result.to_csv(sep="\t", index=False))
方法3:命令行awk实现
- 适用于处理制表符分隔的文本文件,执行以下命令:
awk 'BEGIN{FS=OFS="\t"} NR==1{print; next} { current_prio = ($4 == "TOP" ? 3 : ($3 == "YES" ? 2 : 1)); if (!($1 in map)) { map[$1] = current_prio "\t" $0; } else { split(map[$1], arr, "\t"); if (current_prio > arr[1]) { map[$1] = current_prio "\t" $0; } } } END{for (code in map) {split(map[code], arr, "\t"); print arr[2]}}' your_data.txt | sort -n -k1 - 逻辑:用数组存储每个Service Code的最高优先级行,最后按Service Code升序输出。
内容的提问来源于stack exchange,提问作者MDMP
相关产品推荐
相关产品推荐

