计算两个表中等效行的交集

时间:2014-08-21 14:10:36

标签: python

我有两个FITS文件。让我们考虑例如第一个文件有100行和2列。第二个文件有1000行和2列。

    FITS FILE 1      FITS FILE 2

    A        B        C        D
    1        2        1        2
    1        3        1        2  
    2        4        1        2

我需要取第一个文件的第一行,即1和2,并检查第二个文件中有多少行有1和2. 在我们的示例中,我们有3个第二个文件中有1和2的行。我需要对第二行(第一个文件)执行相同的操作,即1和3,并找出第二个文件中有多少行有1和3等等上。

第一个文件没有重复项(所有行都有不同的对,没有一个是相同的,只有文件2有很多相同的对,我需要找到它们。)

我最终需要第二个文件中的行数与第一个FITS文件的行具有相似的值。

所以最后它会是:

A    B    Number
1    2      3   # 1 and 2 occurs 3 times
1    3      5   # 1 and 3 occurs 5 times

等等。

我知道我需要遍历列表并获得答案。我知道zip将获取第一个文件的行,但我找不到使用这些值进行迭代的方法。

到目前为止,我一直尝试做的是使用zip以某种方式实现它:

for i,j in zip(A,B):
    for m,n in zip(C,D):

使用for i,j in zip(A,B):我将i,j作为第一个文件的第一行,依此类推。所以我可以将它与第二个文件进行比较。

5 个答案:

答案 0 :(得分:4)

你几乎就在那里。您只需要Counter来计算每行在第二个文件中出现的次数。

from collections import Counter
# Create frequency table of (C,D) column pairs
file2freq = Counter(zip(C,D))
# Look up frequency value for each row of file 1
for a,b in zip(A,B):
    # and print out the row and frequency data.
    print a,b,file2freq[a,b]

那就是它!只有四行非常简单的代码。

如果您没有collections.Counter,则可以使用defaultdict进行模拟:

from collections import defaultdict
file2freq = defaultdict(int)
for c,d in zip(C,D):
    file2freq[c,d] += 1
for a,b in zip(A,B):
    print a,b,file2freq[a,b]

答案 1 :(得分:0)

  1. 将文件1行加载到字典中,其中每行加载为0值的键。
  2. 对文件2进行迭代,如果该行与上一个字典中的某个键匹配,则向该键添加一个
  3. 显示字典结果

答案 2 :(得分:0)

这可能会有所帮助。请参阅评论以了解。

import numpy as np
from collections import Counter

A = np.array([1,1,2,4])
B = np.array([2,3,4,5])

C = np.array([1,1,1,1,2,1,1])
D = np.array([2,2,2,3,4,4,3])

dict1 = Counter(zip(C,D)) # made a dictionary of occurrences of results of zipping C an D 

#print dict1 #just uncomment this line to understand what Counter do.
print("A    B : Rowcount")
for i in zip(A,B):
    print (str(i[0]) + "    " + str(i[1]) + " : " + str(dict1[i]))

输出:

A    B : Rowcount
1    2 : 3
1    3 : 2
2    4 : 1
4    5 : 0

答案 3 :(得分:0)

熊猫可能对这类事情很有用。这个例子从头开始构造两个Pandas DataFrame,但应该可以在DataFrame中包装FITS表(我认为这将是一个单独的问题)。要使用帖子中的示例:


>>> import pandas
>>> table1 = pandas.DataFrame({'A': [1, 1, 2], 'B': [2, 3, 4]})
>>> table2 = pandas.DataFrame({'C': [1, 1, 1], 'D': [2, 2, 2]})
>>> table1
   A  B
0  1  2
1  1  3
2  2  4
>>> table2
   C  D
0  1  2
1  1  2
2  1  2

现在有几种方法可以解决这个问题。实际上,所述的问题有点含糊不清。你想要所有 table2中与table1匹配的行吗?或者你可以从table2中排除重复项吗?你可以这样做:


>>> m = pandas.merge(table1, table2, left_on=('A', 'B'), right_on=('C', 'D'), how='inner')
>>> m
   A  B  C  D
0  1  2  1  2
1  1  2  1  2
2  1  2  1  2
>>> m.drop_duplicates()
   A  B  C  D
0  1  2  1  2

基本上,这将为您提供两个表之间通用的所有行。

答案 4 :(得分:-1)

def read_from_file(filename):
    with open(filename, 'r') as f:
        data = f.read()
    return data


def parse_data(data):
    parsed_data = []
    for line in data.split('\n'):
        line_striped = line.strip()  # remove spaces on left and right site
        try:
            left, right = line_striped.split(' ', 1)  # split on first space
        except ValueError:
            continue
        right = right.strip()  # remove spaces on left site from right
        parsed_data.append((left, right))
    return parsed_data


f1_data = read_from_file("file1.txt")
f2_data = read_from_file("file2.txt")
f1_pdata = parse_data(f1_data)
f2_pdata = parse_data(f2_data)

# compare
for f2_item in f2_pdata:
    for f1_item in f1_pdata:
        if f2_item == f1_item:
            print f2_item, "occures in file2 and file1"