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

Python合并DataFrame时重复行Flag赋值问题:仅首行需标记

问题与解决方案

数据集与问题描述

我有两个数据集:
df2

Claim
ABC
ABC
ABC
AAC
AAC
AAC
AAC
ADC
ADC
ADC

df1

ClaimFlag
ABC1
AAC0
ADC1

使用以下代码合并后:

df3 = pd.merge(df2,df1[['Claim','Flag']],on='Claim', how='left')

所有重复的Claim行都被赋予了相同的Flag值,但我期望仅每个Claim的首行保留Flag,其余行Flag为空。

  • 实际输出:
ClaimFlag
ABC1
ABC1
ABC1
AAC0
AAC0
AAC0
AAC0
ADC1
ADC1
ADC1
  • 期望输出:
ClaimFlag
ABC1
ABC
ABC
AAC0
AAC
AAC
AAC
ADC1
ADC
ADC

解决方法

方法1:合并后标记组内首行,其余置空

先完成合并,再通过分组筛选出每个Claim的第一行,其余行的Flag设为空值(pd.NA):

import pandas as pd

df3 = pd.merge(df2, df1[['Claim', 'Flag']], on='Claim', how='left')
# 分组后仅保留每组第一行的Flag,其余设为空
df3['Flag'] = df3.groupby('Claim')['Flag'].transform(lambda x: x.iloc[0] if x.name == x.index[0] else pd.NA)

方法2:先添加组内序号,再合并控制Flag显示

给df2添加组内行号,合并后仅保留行号为1的Flag值:

import pandas as pd

# 给每个Claim的行添加从1开始的序号
df2['group_row'] = df2.groupby('Claim').cumcount() + 1
# 合并数据集
df3 = pd.merge(df2, df1[['Claim', 'Flag']], on='Claim', how='left')
# 仅首行保留Flag,其余设为空
df3['Flag'] = df3['Flag'].where(df3['group_row'] == 1, pd.NA)
# 不需要序号列的话可以删除
df3 = df3.drop('group_row', axis=1)

两种方法最终都会生成符合期望的输出,pd.NA在表格中会显示为空。

内容的提问来源于stack exchange,提问作者Raghav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 17:27:07