Python 3.x 熊猫:过滤掉包含两个期望值的行(唯一ID)

Python 3.x 熊猫:过滤掉包含两个期望值的行(唯一ID),python-3.x,pandas,pandas-groupby,Python 3.x,Pandas,Pandas Groupby,我有一个如下所示的数据帧 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

我有一个如下所示的数据帧

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
n36
的行(唯一ID)。即

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\u c\u 133 x
。。这是我想要避免的。

使用,创建一个布尔掩码
m1
m2
,然后使用
groupby
将掩码
m1
m2
分组到
df[ID]
,现在使用
transform(any)
要创建满足编码条件的布尔掩码,其中
ID
同时包含值
m1
m2
,请使用此掩码过滤数据帧:

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]


你能推荐一些我可以学习这些东西的资源吗?我对熊猫数据框架有非常非正式的了解。谢谢。我建议你向熊猫官方文档学习,例如,一个很好的资源。除此之外,使用
groupby、transform、apply
还有一个很好的资源。但是掌握这些概念的唯一方法是将这些学到的概念实际应用到实际数据本身。
# 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