python与pandas关系_python – 根据多列中的关系合并pandas数据帧

假设您有一个区域(开始,结束)坐标的DataFrame和另一个位置的DataFrame,这些位置可能会也可能不会落在给定区域内.例如:

region = pd.DataFrame({'chromosome': [1, 1, 1, 1, 2, 2, 2, 2], 'start': [1000, 2000, 3000, 4000, 1000, 2000, 3000, 4000], 'end': [2000, 3000, 4000, 5000, 2000, 3000, 4000, 5000]})

position = pd.DataFrame({'chromosome': [1, 2, 1, 3, 2, 1, 1], 'BP': [1500, 1100, 10000, 2200, 3300, 400, 5000]})

print region

print position

chromosome end start

0 1 2000 1000

1 1 3000 2000

2 1 4000 3000

3 1 5000 4000

4 2 2000 1000

5 2 3000 2000

6 2 4000 3000

7 2 5000 4000

BP chromosome

0 1500 1

1 1100 2

2 10000 1

3 2200 3

4 3300 2

5 400 1

6 5000 1

如果出现以下情况,则该职位属于某

position['BP'] >= region['start'] &

position['BP'] <= region['end'] &

position['chromosome'] == region['chromosome']

每个位置都保证在最多一个区域内,尽管它可能不属于任何一个区域.

合并这两个数据框的最佳方法是,如果它落在任何区域,它会附加额外的列来定位它所属的区域.在这种情况下大致给出以下输出:

BP chromosome start end

0 1500 1 1000 2000

1 1100 2 1000 2000

2 10000 1 NA NA

3 2200 3 NA NA

4 3300 2 3000 4000

5 400 1 NA NA

6 5000 1 4000 5000

一种方法是编写一个函数来计算我想要的关系,然后使用DataFrame.apply方法,如下所示:

def within(pos, regs):

istrue = (pos.loc['chromosome'] == regs['chromosome']) & (pos.loc['BP'] >= regs['start']) & (pos.loc['BP'] <= regs['end'])

if istrue.any():

ind = regs.index[istrue].values[0]

return(regs.loc[ind ,['start', 'end']])

else:

return(pd.Series([None, None], index=['start', 'end']))

position[['start', 'end']] = position.apply(lambda x: within(x, region), axis=1)

print position

BP chromosome start end

0 1500 1 1000 2000

1 1100 2 1000 2000

2 10000 1 NaN NaN

3 2200 3 NaN NaN

4 3300 2 3000 4000

5 400 1 NaN NaN

6 5000 1 4000 5000

但我希望有一种比在O(N)时间内进行每次比较更优化的方法.谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值