如何基于指定列对比Pandas DataFrame中不同类别的差异?
Pandas 对比不同类别在指定列的取值差异
原始数据构造
import pandas as pd A = pd.DataFrame({'col1': ['A', 'A', 'B', 'B'], 'col2':['x','y','x1','y']})
生成的DataFrame如下:
| col1 | col2 |
|---|---|
| A | x |
| A | y |
| B | x1 |
| B | y |
需求说明
对比col1中类别A和B在col2上的取值差异,找出:
A有但B没有的col2值B有但A没有的col2值
实现方案
方案一:利用集合差集(简洁高效)
集合天然支持成员关系对比,差集操作可直接得到两类的取值差异:
# 提取两类的col2值集合 a_col2_set = set(A[A['col1'] == 'A']['col2']) b_col2_set = set(A[A['col1'] == 'B']['col2']) # 计算差异 a_not_b = a_col2_set - b_col2_set b_not_a = b_col2_set - a_col2_set print("A有但B没有的col2值:", a_not_b) # 输出: {'x'} print("B有但A没有的col2值:", b_not_a) # 输出: {'x1'}
方案二:使用Pandas的isin方法(贴合API风格)
通过isin方法判断取值是否存在于另一类的集合中,筛选出差异值:
# 获取B类的col2值列表 b_col2_vals = A[A['col1'] == 'B']['col2'] # 筛选A类中不在B类col2里的取值并去重 a_not_b = A[(A['col1'] == 'A') & (~A['col2'].isin(b_col2_vals))]['col2'].unique() # 获取A类的col2值列表 a_col2_vals = A[A['col1'] == 'A']['col2'] # 筛选B类中不在A类col2里的取值并去重 b_not_a = A[(A['col1'] == 'B') & (~A['col2'].isin(a_col2_vals))]['col2'].unique() print("A有但B没有的col2值:", a_not_b) # 输出: ['x'] print("B有但A没有的col2值:", b_not_a) # 输出: ['x1']
内容的提问来源于stack exchange,提问作者navee pp
相关产品推荐
相关产品推荐

