数据框之间的numpy比较

时间:2018-08-15 10:07:25

标签: python pandas numpy dataframe

我正在尝试比较两个不同数据帧的行(例如短子集):

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')

1 个答案:

答案 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)