Python合并DataFrame时重复行Flag赋值问题:仅首行需标记
问题与解决方案
数据集与问题描述
我有两个数据集:df2
| Claim |
|---|
| ABC |
| ABC |
| ABC |
| AAC |
| AAC |
| AAC |
| AAC |
| ADC |
| ADC |
| ADC |
df1
| Claim | Flag |
|---|---|
| ABC | 1 |
| AAC | 0 |
| ADC | 1 |
使用以下代码合并后:
df3 = pd.merge(df2,df1[['Claim','Flag']],on='Claim', how='left')
所有重复的Claim行都被赋予了相同的Flag值,但我期望仅每个Claim的首行保留Flag,其余行Flag为空。
- 实际输出:
| Claim | Flag |
|---|---|
| ABC | 1 |
| ABC | 1 |
| ABC | 1 |
| AAC | 0 |
| AAC | 0 |
| AAC | 0 |
| AAC | 0 |
| ADC | 1 |
| ADC | 1 |
| ADC | 1 |
- 期望输出:
| Claim | Flag |
|---|---|
| ABC | 1 |
| ABC | |
| ABC | |
| AAC | 0 |
| AAC | |
| AAC | |
| AAC | |
| ADC | 1 |
| 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
相关产品推荐
相关产品推荐

