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

时间:2015-02-20 10:41:20

标签: python algorithm list matching

以下问题是对此处发布的问题的概括:

Counting the intersection of equivalent rows in two tables

我有两个FITS文件。例如,第一个文件有100行和2列。第二个文件有1000行和3列

FITS FILE 1 FITS FILE 2

A        B        C        D     E 

1        2        1        2    0.1
1        3        1        2    0.3 
2        4        1        2    0.9 

我需要取第一个文件的第一行,即1和2,并检查第二个文件中有多少行有C = 1和D = 2 加权每对(C,D)相对于E列中的相应值

在该示例中,我在第二个文件中有3行,其中C = 1且D = 2.它们的权重分别为E = 0.1,0.3和0.9。相对于E中的值加权,我需要将值0.1 + 0.3 + 0.9 = 1.3与第一个文件的对(A,B)=(1,2)相关联。然后,我需要对第二行(第一个文件)执行相同的操作,即1和3,并找出第二个文件中有多少行有1和3,再次相对于E列中的值加权,依此类推

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

我最终需要第二个文件中加权数的行,其值与第一个FITS文件的行的值相似。

结果应为:

A B Number 1 2 1.3 # 1 and 2 occurs 1.3 times 1 3 4.5 # 1 and 3 occurs 4.5 times

对于A和B列中的所有对,

等等。

我从上面引用的帖子中得知,E栏中权重的解决方案均等于1,涉及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]

要回答这个问题,我需要在使用Counter时在E中加入权重:

file2freq = Counter(zip(C,D))

我想知道是否可以这样做。

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:1)

我跟进了Iguananaut在对该问题的评论中提出的建议。我相信numpy是一个理想的工具。

import numpy as np

fits1 = np.genfromtxt('fits1.csv')
fits2 = np.genfromtxt('fits2.csv')

summed = np.zeros(fits1.shape[0])
for ind, row in enumerate(fits1):
    condition = (fits2[:,:2] == row).all(axis=1)
    summed[ind] = fits2[condition,-1].sum()  # change the assignment operator to += if the rows in fits1 are not unique

导入后,前两行将加载文件中的数据。这将返回一个浮点数组,其中包含警告:将一个浮点数与另一个浮点数进行比较容易出现错误。在这种情况下它会起作用,因为fits1.csv中的列和fits2.csv中的前两列都是整数,并由genfromtxt以相同的方式解析。

然后,在for循环中创建变量condition,该变量表明fits2中的前两列与row的{​​{1}}列匹配时它应该被考虑在内(结果是一个布尔数组)。 然后,最后,对于当前行索引fits1,将数组ind的值设置为summed第3列中所有值的总和,其中fits2condition

对于我制作的一个小例子,我得到了这个:

True