如何基于两列值过滤DataFrame:提取对应多地点的code数据
提取对应多地点的Code全部记录解决方案
核心需求:筛选DataFrame中code列对应**2个及以上不同location**的所有行,保留这些code的全部记录,排除仅对应单一地点的code。
方法一:GroupBy + Transform 直接映射统计值
通过分组统计每个code的不同location数量,将统计结果映射到原DataFrame的每一行,再筛选符合条件的行:
import pandas as pd # 示例DataFrame df = pd.DataFrame({ 'code': ['101', '102', '102', '102', '103', '103', '104', '105'], 'location': ['伦敦', '曼彻斯特', '博尔顿', '奥尔德姆', '利兹', '哈德斯菲尔德', '伯明翰', '利物浦'] }) # 为每行添加对应code的不同location数量 df['loc_count'] = df.groupby('code')['location'].transform('nunique') # 筛选并移除辅助列 result = df[df['loc_count'] >= 2].drop('loc_count', axis=1) print(result)
方法二:先筛选有效Code再过滤
先找出符合条件的code列表,再用isin()过滤原DataFrame:
# 统计每个code的不同location数量 code_loc_counts = df.groupby('code')['location'].nunique() # 获取对应多地点的code列表 valid_codes = code_loc_counts[code_loc_counts >= 2].index # 过滤原DataFrame result = df[df['code'].isin(valid_codes)] print(result)
为什么直接用duplicated()不行?
duplicated()仅判断行(或指定列)是否重复,无法区分「同一code对应多个不同location」和「同一code重复但location相同」的情况。比如一个code多次出现但location全一致,duplicated()会标记重复,但这类code不符合你的需求,因此必须通过统计不同location的数量来筛选。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

