Chinaunix

标题: 如何根据一个数据框的值过滤另一个数据框 [打印本页]

作者: elaine2017    时间: 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的这一行

请问这个该怎么做?

作者: christmas1102    时间: 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

草稿无简,凑合着用吧

作者: sunlove521    时间: 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())







欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2