免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 19840 | 回复: 2
打印 上一主题 下一主题

如何根据一个数据框的值过滤另一个数据框 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2018-09-05 10:17 |只看该作者 |倒序浏览
现在有两个pandas数据框:
data1,有三列
   start  end strand
     -1   38      W
     60  235      W
    235  418      W
    454  500      W
     -1   43      C
     79  262      C
    262  437      C
    459  500      C


data2,有两列
    start strand
     39      W
     56      W
     61      W
    119      W
    187      W
    220      W
    455      W
    483      W
     14      C
     42      C
     64      C
     78      C
    156      C
    192      C


现在想根据data1过滤data2,条件是,在strand这一列值相同的情况下,data2的第一列应在data1的前两列的范围内,例如:
39,其strand=W,其值不存在于[-1,38],[60,235],[235,418],[454,500]任意一个范围内,因此过滤掉data2的这一行

请问这个该怎么做?

论坛徽章:
4
15-16赛季CBA联赛之青岛
日期:2018-07-09 14:17:2815-16赛季CBA联赛之八一
日期:2018-08-06 15:30:0515-16赛季CBA联赛之广东
日期:2018-08-09 09:11:2115-16赛季CBA联赛之佛山
日期:2019-02-14 09:26:31
2 [报告]
发表于 2018-09-07 12:55 |只看该作者
本帖最后由 christmas1102 于 2018-09-07 13:02 编辑
  1. # -*- coding: utf-8 -*-
  2. a=[];b=[];c=[];d=[];e=[];f=[]

  3. with open(r'E:\data1.txt','r+') as f1:
  4.     for line1 in f1.readlines():
  5.         line1 = line1.rstrip("\n")
  6.         a.append(line1.split())
  7.         f1.close()

  8. with open(r'E:\data2.txt','r+') as f2:
  9.     for line2 in f2.readlines():
  10.         line2 = line2.rstrip("\n")
  11.         b.append(line2.split())
  12.         f2.close()

  13. for i in range(1,len(a)):
  14.     if a[i][2] == 'W':
  15.         c.append([int(x) for x in a[i][:2]])
  16.     elif a[i][2] == 'C':
  17.         e.append([int(x) for x in a[i][:2]])

  18. for i in range(1,len(b)):
  19.     if b[i][1] == 'W':
  20.         d.append(int(b[i][0]))
  21.     elif b[i][1] == 'C':
  22.         f.append(int(b[i][0]))
  23. #---------------------------------
  24. print(b[0][0] + "\t" + b[0][1])
  25. for i in d:
  26.     for j in range(len(c)):
  27.         if i in range(c[j][0],c[j][1]+1):
  28.             print("%d\t\t  %s" % (i,'W'))
  29. for i in f:
  30.     for j in range(len(e)):
  31.         if i in range(e[j][0],e[j][1]+1):
  32.             print("%d\t\t  %s" % (i, 'C'))
复制代码

E盘data1.txt
E盘data2.txt

草稿无简,凑合着用吧

评分

参与人数 1信誉积分 +5 收起 理由
elaine2017 + 5

查看全部评分

论坛徽章:
0
3 [报告]
发表于 2020-02-24 18:25 |只看该作者
#!/usr/bin/env python3

#f1 = open('data1.txt')
f2 = open('data2.txt')
find_max = {}
for i in f2:
    find_max = {}
    i = i.strip()
    line = i.split()
    a = int(line[0])
    b = line[1]
    find_max[a] = [a,b]
#    print (find_max[a][0])
    f1 = open('data1.txt')
    for x in f1:
        x = x.strip()
        line1 = x.split()
        d = int(line1[0])
        e = int(line1[1])
        f = line1[2]
        if d < find_max[a][0] < e and find_max[a][1] == f:
            find_max[a] = [a,b]
            print (find_max.values())


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP