如何对DataFrame执行多行间条件过滤:按location_id筛选client_id
问题描述
原始DataFrame如下:
client_id location_id region_name location_name 1 123 Florida location_ABC 6 123 Florida(P) location_ABC 6 845 Miami(P) location_THE 1 386 Boston location_WOP 6 386 Boston(P) location_WOP
需求:
- 若某个
location_id对应多个不同的client_id,选取其中client_id == 1的行; - 若某个
location_id仅对应一个client_id,保留该行即可。
期望结果:
client_id location_id region_name location_name 1 123 Florida location_ABC 6 845 Miami(P) location_THE 1 386 Boston location_WOP
解决思路
方法一:分组统计+拆分合并
- 先统计每个
location_id对应的不同client_id数量:client_unique_counts = df.groupby('location_id')['client_id'].nunique() - 拆分出两类
location_id:有多个不同client_id的组,以及只有单个client_id的组:multi_client_locs = client_unique_counts[client_unique_counts > 1].index single_client_locs = client_unique_counts[client_unique_counts == 1].index - 分别筛选对应数据后合并:
# 多client_id组中取client_id=1的行 part1 = df[(df['location_id'].isin(multi_client_locs)) & (df['client_id'] == 1)] # 单client_id组保留所有行 part2 = df[df['location_id'].isin(single_client_locs)] # 合并并排序,和示例结果对齐 result = pd.concat([part1, part2]).sort_values('location_id').reset_index(drop=True)
方法二:用transform实现行级标记(更简洁)
通过transform给每行添加所在分组的client_id唯一数量,直接按条件过滤:
# 给每行添加该location_id的不同client_id数量 df['client_unique_count'] = df.groupby('location_id')['client_id'].transform('nunique') # 过滤逻辑:单client_id组直接保留,多client_id组只留client_id=1的行 result = df[ (df['client_unique_count'] == 1) | ((df['client_unique_count'] > 1) & (df['client_id'] == 1)) ].drop('client_unique_count', axis=1) # 可选:按location_id排序 result = result.sort_values('location_id').reset_index(drop=True)
两种方法都能得到目标结果,方法二无需拆分合并,代码更紧凑。
内容的提问来源于stack exchange,提问作者bellotto
相关产品推荐
相关产品推荐

