首页 > 解决方案 > Pandas:过滤掉包含两个期望值的行(唯一 ID)

问题描述

我有一个如下所示的数据框;

ID          code

333_c_132   x
333_c_132   n06
333_c_132   n36
333_c_132   n60
999_c_133   x
999_c_133   n06
999_c_133   n12
999_c_133   n24
998_c_134   x
998_c_134   n06
998_c_134   n12
998_c_134   n18
998_c_134   n36
997_c_135   x
997_c_135   n06
997_c_135   n12
997_c_135   n24
997_c_135   n36

我想过滤掉同时包含x和的行(唯一 ID) n36。IE

ID          code
333_c_132   x
333_c_132   n36
998_c_134   x
998_c_134   n36
997_c_135   x
997_c_135   n36

我像这样尝试过;

df = df[(df.code == "x") | (df.code == "n36")]

但它999_c_133 x也会返回......我想避免。

标签: python-3.xpandaspandas-groupby

解决方案


使用,Series.eq创建一个布尔掩码m1m2然后使用groupby对掩码m1& m2on进行分组df[ID],现在用于transform(any)创建一个布尔掩码,它满足ID包含值m1m2的编码,然后使用此掩码过滤数据帧:

m1 = df['code'].eq('x')
m2 = df['code'].eq('n36')
m = (
    m1.groupby(df['ID']).transform('any') & 
    m2.groupby(df['ID']).transform('any') & 
    df['code'].isin(['x', 'n36'])
)
df1 = df[m]

# print(df1)
           ID code
0   333_c_132    x
2   333_c_132  n36
8   998_c_134    x
12  998_c_134  n36
13  997_c_135    x
17  997_c_135  n36

推荐阅读