Pandas: отфильтровать строки (уникальный идентификатор), содержащие два желаемых значения. - PullRequest
2 голосов
/ 19 июня 2020

У меня есть фрейм данных, как показано ниже;

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. 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 ... чего я хочу избежать.

1 Ответ

2 голосов
/ 19 июня 2020

Используйте, Series.eq для создания логической маски 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]

# 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
...