在Python中搜索和匹配来自两个文件的数据

时间:2018-05-04 03:54:45

标签: python-2.7 numpy append

我有两个不同的文件;参考文件和不同长度的数据集。

A reference file ("location.dat") contains:
40505   5.0666667   102.2166667
40517   5.6833333   101.8500000
40586   5.7666667   102.2000000
40587   5.8166667   102.0500000
40663   6.0333333   102.1166667
41525   5.5500000   100.4833333
41529   5.3500000   100.4000000 
...............
...............

A data sets ("input.dat") contains:
40517   2014    12  18  0   17.4
40586   2014    12  18  0   9.9
40587   2014    12  18  0   15.5
40663   2014    12  18  0   30.9
41525   2014    12  18  0   0
41529   2014    12  18  0   0
41540   2014    12  18  0   0
41543   2014    12  18  0   0
41548   2014    12  18  0   0
41549   2014    12  18  0   0
41551   2014    12  18  0   0
41610   2014    12  18  0   0

问题: 如何搜索和匹配数据集,以便输出文件将两个文件中的某些选定值组合在一起,如下所示:

output.dat
40517   5.6833333   101.8500000 17.4
40586   5.7666667   102.2000000 9.9
40587   5.8166667   102.0500000 15.5
............
...........

The current script is:

data1=np.loadtxt('location.dat')
   lats1=data1[:,1]
   lons1=data1[:,2]
   code1=data1[:,0]

    data2=np.loadtxt('input.dat')
    rain=data2[:,5]
    code2=data2[:,0]

    ind=[]
    for i in range(len(data1)):
       dist=code1[i]
       ind.append(np.where(dist==np.int(dist))[0][0])
       rain2=rain[ind]

    data3=np.array([code1,lats1,lons1,rain2])
    data3=np.transpose(data3)
    np.savetxt('output.dat',data3,fmt='%9.3f')

当前结果

40517.000     5.683   101.850     0.000
40586.000     5.767   102.200     0.000
40587.000     5.817   102.050     0.000
40663.000     6.033   102.117     0.000
41525.000     5.550   100.483     0.000
41529.000     5.350   100.400     0.000
41540.000     5.383   100.550     0.000

rain2值未正确附加到输入文件中。如何将第一列输出转换为整数?。任何出错的想法??。TQ

1 个答案:

答案 0 :(得分:1)

该行

ind.append(np.where(dist==np.int(dist))[0][0])

在您的代码中没有意义。如果dist是一个整数,那么它总是会追加0(因为dist==np.int(dist)只是数组[True])

解决问题的更好方法是根据location.dat

中的数据创建查找表
data1=np.loadtxt('location.dat')
lookup = {int(round(id_)):(lat,long) for id_, lat, long in data1}

请注意,在python中将float转换为int的最佳方法是使用int(round(i))

然后,您可以迭代其他文件中的数据并创建正确的行

data3 = []
for line in data2:
    ind = int(round(line[0]))
    data3.append([ind, lookup[ind][0], lookup[ind][1], line[5]])

要保存数据,您可能需要一个接一个地格式化和写入该行,或使用savetxt