问题
当查询的列有多个值时,如何检查一列中的值是否在另一列中?
最小可重复性示例
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 之间变化很大
您可以使用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
使用列表组件:
[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
您需要创建一个简单的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错误