pandas 当查询的列有多个值时,如何检查一列中的值是否在另一列中?

umuewwlo  于 2023-04-19  发布在  其他
关注(0)|答案(3)|浏览(202)

问题

当查询的列有多个值时,如何检查一列中的值是否在另一列中?

最小可重复示例

df1 = pd.DataFrame({'patient': ['patient1', 'patient1', 'patient1','patient2', 'patient2', 'patient3','patient3','patient4'], 
                   'gene':['TYR','TYR','TYR','TYR','TYR','TYR','TYR','TYR'],
                   'variant': ['buu', 'luu', 'stm','lol', 'bla', 'buu', 'lol','buu'],
                    'genotype': ['buu,luu,hola', 'gulu,melon', 'melon,stm','melon,buu,lol', 'bla', 'het', 'het','het']})

print(df1)

    patient gene variant       genotype
0  patient1  TYR     buu   buu,luu,hola
1  patient1  TYR     luu     gulu,melon
2  patient1  TYR     stm      melon,stm
3  patient2  TYR     lol  melon,buu,lol
4  patient2  TYR     bla            bla
5  patient3  TYR     buu            het
6  patient3  TYR     lol            het
7  patient4  TYR     buu            het

我所尝试的

df1.variant.isin(df1.genotype)

0    False
1    False
2    False
3    False
4     True
5    False
6    False
7    False
Name: variant, dtype: bool

这不起作用。预期结果将是:

0    True
1    False
2    True
3    True
4    True
5    False
6    False
7    False
Name: variant, dtype: bool

我不知道列基因型有多少个不同的值。从1到20变化很大

3df52oht

3df52oht1#

可以使用DataFrame.apply + str.split

print(df1.apply(lambda x: x['variant'] in x['genotype'].split(','), axis=1))

图纸:

0     True
1    False
2     True
3     True
4     True
5    False
6    False
7    False
dtype: bool
qlvxas9a

qlvxas9a2#

使用 listcomp

[var in gen for var,gen in zip(df1["variant"], df1["genotype"])]

输出:

# with the Series constructor pd.Series(...)

0     True
1    False
2     True
3     True
4     True
5    False
6    False
7    False
dtype: bool
093gszye

093gszye3#

您需要创建一个简单的function并使用apply遍历所有行。

def check_variant(df):
    
    return True if df['genotype'].find(df['variant']) != -1 else False

触发器:

df1.apply(check_variant, axis=1)

结果:

0     True
1    False
2     True
3     True
4     True
5    False
6    False

7错误

相关问题