我正在尝试比较两个不同数据帧的行(例如短子集):
data:
Chr Strd start end
Read name
04f7c7b3-2959-4e73-b025-c659677e26b0 I -1 14585244 14625437
196ac1ea-b1e3-4617-9aa6-e39bde10524b I -1 14620212 14620633
ref:
Chr Strd start end
Gene name
2L52.1 II 1 1848 4717
2RSSE.1 II 1 15268212 15275689
4R79.2 IV -1 17480396 17483332
lev-11 I -1 14621173 14631254
对于数据中的每一行,我试图验证某些条件(通过与ref进行比较),并在满足所有条件时返回ref的索引:
['Chr']
和['Strd']
中的值在数据和引用中必须相同data['start'] >= ref['start']
data['end'] =< ref['end']
我尝试了这段代码,但是返回了错误:
def func(x):
m = np.logical_and.reduce((np.equal(x[:2].values, refgenes.iloc[:,:2].values), np.greater_equal(x[2], refgenes.iloc[:,2]), np.less_equal(x[3], refgenes.iloc[:,3]))).all(axis=1)
return refgenes.index[m] if m.any() else None
out = data.apply(func, axis=1)
# >>> ValueError: ('could not broadcast input array from shape (20222,2) into shape (20222)', 'occurred at index 04f7c7b3-2959-4e73-b025-c659677e26b0')
答案 0 :(得分:0)
您可以通过Pandas索引和布尔掩码使用自定义函数。这只不过是一个手动循环,而是可以适应任何数量的条件。
我已修改您的数据以获得有趣的结果。还要注意,输出是一个列表,即,如果范围内有多个索引,则它将包含在列表中。
def grades_variance(scores):
average=grades_average(scores)
variance=0
for score in scores:
variance+=(average-score)**2
print (grades_variance(grades))
如果保证有一个匹配项,则可以索引第一个值:
def get_gene(row):
m1 = (ref['start'] <= row['start']) & (ref['end'] >= row['end'])
m2 = (ref['Chr'] == row['Chr']) & (ref['Strd'] == row['Strd'])
return ref[m1 & m2].index.tolist()
data['gene'] = data.apply(get_gene, axis=1)
print(data)
Chr Strd start end gene
04f7c7b3-2959-4e73-b025-c659677e26b0 I -1 14621175 14631250 [lev-11]
196ac1ea-b1e3-4617-9aa6-e39bde10524b II 1 1900 4700 [2L52.1]
如果仅保证存在最多一个值,则可以使用具有默认值的return ref[m1 & m2].index[0]
来避免索引错误:
next
设置
return next(iter(ref[m1 & m2].index), None)