Pandas DataFrame查询问题:筛选仅关联'c'的A列值
解决Pandas筛选仅关联特定B值的A列元素问题
我来帮你修正这个问题,先拆解你的思路问题,再给出更简洁高效的解决方案~
你的代码问题分析
你的核心思路是对的:先找到所有关联非'c'值的A列,再从关联'c'的A列中排除这些值。但代码里有个关键错误:d[d.B.isin(set(d.B.unique())-{'c'})].A.to_frame() 返回的是一个DataFrame,而 d.A.isin() 需要传入一维的序列/列表/数组,这就导致过滤逻辑失效,最终返回了所有关联'c'的A值(比如2、3、4),而没有排除那些同时关联其他值的A。
修正你的思路代码
只需要把 to_frame() 去掉,换成提取A列的唯一值(或者直接取A列),就能实现你的逻辑:
import pandas as pd d=pd.DataFrame([[1,'a'],[1,'b'],[2,'c'],[2,'a'],[3,'c'],[4,'a'],[4,'c']],columns=['A','B']) # 步骤1:找出所有关联非'c'值的A列唯一值 non_c_A = d[d.B != 'c']['A'].unique() # 步骤2:筛选出关联'c'且不在non_c_A中的A result = d[(d.B == 'c') & (~d.A.isin(non_c_A))]['A'].unique() print(result) # 输出: [3]
更简洁的高效方案
推荐用Pandas的groupby功能来实现,逻辑更直观,代码也更简洁:
方法1:groupby + filter
按A列分组,筛选出组内所有B值都是'c'的组:
# 筛选符合条件的行,再提取唯一的A值 filtered_rows = d.groupby('A').filter(lambda group: (group['B'] == 'c').all()) result = filtered_rows['A'].unique() print(result) # [3]
方法2:groupby统计唯一值
统计每个A对应的B值唯一数量,仅保留唯一值为'c'的A:
# 计算每个A对应的B值是否只有'c' valid_A = d.groupby('A')['B'].agg(lambda x: x.nunique() == 1 and x.iloc[0] == 'c') # 提取符合条件的A索引 result = valid_A[valid_A].index.tolist() print(result) # [3]
内容的提问来源于stack exchange,提问作者user17144
相关产品推荐
相关产品推荐

