我已经从两个tsv文件创建了两个数据帧。数据帧如下:
Dataframe1 (df1)
chr position
5 745
7 963
8 1024
Dataframe2 (df2)
chr start end
1 10 100
1 500 600
5 250 600
5 784 1045
7 98 980
7 11 85
8 450 1000
8 1546 1886
12 63 1400
现在,我想创建一个新的df1列,如果相同chr
的位置落在df2的start
和end
之内,它将给出'True'。我正在使用以下代码:
df1['Valid'] = np.where((df1['chr'] == df2['chr']) & (df1['position'] >= df2['start']) & (df1['position'] <= df2['end']),'True','False')
这不起作用,并显示错误消息-ValueError:只能比较标记相同的Series对象。该怎么做?
预期输出为:
Dataframe1 (df1)
chr position Valid
5 745 False
7 963 True
8 1024 False
答案 0 :(得分:2)
合并数据框,求值,然后删除未使用的列。
>>> (df1
.merge(df2, on='chr', how='left')
.assign(Valid=lambda df: df.eval('start <= position <= end'))
.drop(columns=['start', 'end'])
)
chr position Valid
0 5 745 False
1 7 963 True
2 8 1024 False
如果chr
中有多个df2
值,请将position
合并到df2
上,对每个值求值,然后对chr
进行分组并确定是否任何职位均有效。将结果分配回df1
:
valid = (
df2
.merge(df1, on='chr', how='right')
.assign(Valid=lambda df: df.eval('start <= position <= end'))
.groupby('chr')['Valid'].any()
)
>>> df1.merge(valid, left_on='chr', right_index=True)
chr position Valid
0 5 745 False
1 7 963 True
2 8 1024 False
答案 1 :(得分:0)
看看:
import pandas as pd
import numpy as np
df1 = pd.DataFrame({'chr': [5,7,8],
'position': [745, 963,1024]})
df2 = pd.DataFrame({'chr': [1,5,7,8,12],
'start': [10,250,98,450,63],
'end':[100,600,980,1000,1400]})
df2 = df2.loc[df2['chr'].isin(df1.chr)].reset_index(drop=True)
df1['Valid'] = np.where((df1['chr'] == df2['chr']) & (df1['position'] >= df2['start']) & (df1['position'] <= df2['end']),'True','False')
print(df1)
和输出:
chr position Valid
0 5 745 False
1 7 963 True
2 8 1024 False
答案 2 :(得分:0)
我将export inteface ICourse {
id: number;
name: string;
year: string;
}
和map
和any
一起使用布尔掩码
groupby