Python 计算两个表中等价行的加权交集
以下问题是对此处发布的问题的概括: 我有两个文件。例如,第一个文件有100行和2列。第二个文件有1000行和3列Python 计算两个表中等价行的加权交集,python,algorithm,list,matching,Python,Algorithm,List,Matching,以下问题是对此处发布的问题的概括: 我有两个文件。例如,第一个文件有100行和2列。第二个文件有1000行和3列 适合文件1适合文件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,并检查第二个文件中有多少行的
适合文件1适合文件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文件中的行具有类似值的行的加权数
结果应该是:
ab编号
1.2 1.3#1和2出现1.3次
1 3 4.5#1和3出现4.5次
对于A列和B列中的所有对,依此类推
我从上面引用的帖子中知道,E列中权重均等于1的解决方案涉及计数器
,如下所示:
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]
要回答这个问题,我需要在使用计数器时将权重包含在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
导入后,前两行将从文件中加载数据。这将返回一个浮点数组,并附带警告:将一个浮点与另一个浮点进行比较容易出现错误。在本例中,它将起作用,因为fits1.csv
中的两列和fits2.csv
中的前两列都是整数,并且由genfromtxt
以相同的方式解析
然后,在for循环中创建变量condition
,该变量表示只要fits2
中的前两列与fits1
的当前行
中的列相匹配,就要将其考虑在内(结果是一个布尔数组)。
然后,最后,对于当前行索引ind
,将数组summated
的值设置为fits2
第3列中所有值的总和,其中条件为True
我举了一个小例子,我得到了:
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. ])