如何用Pandas筛选仅包含'wrd'值对应的name列数据?
解决方法
你的需求是筛选出**所有对应记录的value仅包含'wrd'**的name(即该name的每一行value都是'wrd',没有其他值),之前的代码只是筛选了value为'wrd'的行,但无法排除那些同时存在其他value的name(比如abc987)。以下是两种可行的实现方式:
方法一:用groupby+transform直接过滤行
这种方法可以直接得到符合要求的所有行:
import pandas as pd # 过滤出所有属于"仅含wrd的name"的行 result = df[df.groupby('name')['value'].transform(lambda x: (x == 'wrd').all())] # 如果只需要提取唯一的name列表: valid_names = result['name'].unique()
方法二:先筛选合法name再过滤数据
先找出所有符合条件的name,再用这些name去原DataFrame中筛选:
# 按name分组,获取每个name对应的所有唯一value name_unique_values = df.groupby('name')['value'].unique() # 筛选出唯一值仅为'wrd'的name valid_names = name_unique_values[name_unique_values.apply(lambda x: len(x) == 1 and x[0] == 'wrd')].index # 用合法name过滤原数据 result = df[df['name'].isin(valid_names)]
原理说明
- 第一种方法通过
groupby('name')对每个name的value组进行检查,transform会将组内的检查结果映射回每一行,从而直接过滤出符合条件的行。 - 第二种方法先统计每个name的所有唯一value,只保留那些唯一值只有'wrd'的name,再用这些name去原数据中筛选。
内容的提问来源于stack exchange,提问作者James Lane
相关产品推荐
相关产品推荐

