如何在Pandas DataFrame中按姓氏条件清空指定Location单元格?
处理DataFrame重复姓氏的Location列保留需求
问题场景
针对DataFrame中的姓氏列,需实现:每个姓氏的前两个重复项,将其对应Location列内容设为NaN(不得删除整行),仅保留第三个及以后的Location值(示例姓氏如Balchuinas、London、Fleck均需遵循此规则)。此前使用drop_duplicates(keep='last')会直接删除整行,不符合需求。
解决方案
利用groupby+cumcount给每个姓氏组内的行编号,再通过布尔索引精准修改Location列的值,代码如下:
import pandas as pd # 假设DataFrame名为df,姓氏列是'Last Name',Location列是'Location' # 1. 给每个姓氏组内的行分配从1开始的序号 df['_temp_rank'] = df.groupby('Last Name').cumcount() + 1 # 2. 将组内序号为1、2的行的Location设为NaN df.loc[df['_temp_rank'].isin([1, 2]), 'Location'] = pd.NA # 3. 删除临时序号列,保持数据结构整洁 df = df.drop('_temp_rank', axis=1)
代码说明
groupby('Last Name').cumcount()会给每个姓氏组内的行从0开始计数,加1后转为从1开始的序号,方便定位前两项。- 布尔索引
df['_temp_rank'].isin([1, 2])精准匹配每个姓氏的前两行,直接修改Location列值为NaN,全程保留整行数据。 - 若你的姓氏列或Location列名称不同,替换代码中对应列名即可。
内容的提问来源于stack exchange,提问作者Vish
相关产品推荐
相关产品推荐

