以下问题是对此处发布的问题的概括:
Counting the intersection of equivalent rows in two tables
我有两份文件。例如,第一个文件有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相对于e列中的相应值对每对(c,d)进行加权。
在这个例子中,我在第二个文件中有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 Number1 2 1.3 # 1 and 2 occurs 1.3 times1 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))

我在想是否可以这样做。
非常感谢你的帮助!

最佳答案

我将对伊瓜那诺在对这个问题的评论中提出的建议采取后续行动。我相信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

导入后,前两行将从文件中加载数据。这将返回一个float数组,该数组附带警告:比较一个float和另一个float很容易出错。在这种情况下,它仍然可以工作,因为fits1.csv中的列和fits2.csv中的前两列都是整数,解析方式与genfromtxt相同。
然后,在for循环中创建变量condition,该变量表示无论何时fits2中的前两列与row的当前fits1列匹配,都要将其考虑在内(结果是一个布尔数组)。
最后,对于当前行索引ind,将数组的值设置为summed的第3列中所有值的总和,其中fits2condition
举个小例子,我得到了:
oliver@armstrong:/tmp/sto$ cat fits1.csv
1   2
1   3
2   4
oliver@armstrong:/tmp/sto$ cat fits2.csv
1   2   .1
1   2   .3
1   2   .9
2   4   .3
1   5   .5
2   4   .7
# run the above code:
# summed is:
# array([ 1.3,  0. ,  1. ])

关于python - 计算两个表中等效行的加权交集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28626989/

10-12 21:36