pandas 如何筛选一列中的两个特定值在另一列中具有公共值

q8l4jmvw  于 2023-04-04  发布在  其他
关注(0)|答案(2)|浏览(115)

问题

我的 Dataframe 的最小可重复示例如下所示

df = pd.DataFrame({'patient': ['patient1', 'patient1', 'patient1','patient2', 'patient2', 'patient3','patient3','patient4','patient4','patient4','patient4'], 
                   'gene':['TYR','TYR','TYR','TYR','TYR','TYR','TYR','TYR','TYR', 'TYR','TYR'],
                   'variant': ['buu', 'luu', 'stm','lol', 'bla', 'buu', 'lol','buu', 'luu', 'IDK','ploy'],
                    'genotype': ['hom', 'het', 'hom','het', 'hom', 'het', 'het','het', 'hom', 'hom','hom']})

df

 patient gene variant genotype
0   patient1  TYR     buu      hom
1   patient1  TYR     luu      het
2   patient1  TYR     stm      hom
3   patient2  TYR     lol      het
4   patient2  TYR     bla      hom
5   patient3  TYR     buu      het
6   patient3  TYR     lol      het
7   patient4  TYR     ploy     het
8   patient4  TYR     luu      hom
9   patient4  TYR     IDK      hom
10  patient4  TYR     buu      hom

我需要找出带有“buu”和“luu”变体的病人

结果

patient1  TYR     buu      hom
patient1  TYR     luu      het
patient4  TYR     luu      hom
patient4  TYR     buu      hom
js4nwp54

js4nwp541#

Group by patient和过滤器组保留那些variant包含两个所需变体(buuluu)的组:

var_set = {'buu', 'luu'}  # set of variants
df[df['variant'].isin(var_set)].groupby('patient')\
    .filter(lambda x: set(x['variant']) >= var_set)
  • 当集合A是集合B的超集时,set(A) >= set(B)给出True

由于数据集从一开始就被过滤(通过var_set),因此使用以下组过滤器可以实现相同的效果:

  • set(x['variant']) == var_set
  • x['variant'].nunique() == 2
patient gene variant genotype
0  patient1  TYR     buu      hom
1  patient1  TYR     luu      het
7  patient4  TYR     buu      het
8  patient4  TYR     luu      hom
5lwkijsr

5lwkijsr2#

另一种方法是首先过滤 Dataframe ,然后使用.nunique.transform查找符合条件的行。

df1 = df.loc[df["variant"].isin(["buu", "luu"])]

out = df1.loc[
        df1.groupby(["patient", df1["variant"].isin(["luu", "buu"])])["variant"].transform(
            "nunique"
        )
        >= 2
    ]

print(out)

    patient gene variant genotype
0  patient1  TYR     buu      hom
1  patient1  TYR     luu      het
7  patient4  TYR     buu      het
8  patient4  TYR     luu      hom

相关问题