【问题标题】:Python: search in file with multiple criteriaPython:在文件中搜索多个条件
【发布时间】:2015-01-17 18:59:42
【问题描述】:

我有一个包含多个列的文本文件,如下所示:

1000 1 2 3
1000 1.5 2.5 3.1
2000 4 5 6
3000 7 8 9

我想创建一个 python 脚本,在其中输入一系列 3 个数字,在前 3 列中搜索最接近的数字并返回最后一列的相应值。 例如,如果我输入1200 1 2,它应该返回3

更新:是否可以在第二行和第三行具有相同值的数据之间进行线性插值? 例如我的数据是: 1000 100 2 0.1 1200 100 2 0.2 1000 80 3 0.4 我的输入是 '1100 100 2',它应该返回 0.15。

【问题讨论】:

  • 嘿,如果您添加一些您尝试过的代码会更好
  • 目前我不知道如何开始。
  • 您可以通过 df = pd.read_fwf(path_to_txt_file) 将其读入 pandas df 但是您尚未定义最接近的标准,例如您只能获得 1 或 2 个完全匹配但其余值不是close 或者你可以让所有 3 个都接近但没有完全匹配,这里是否应用了权重?
  • 您确实需要更好地尝试一下,并在遇到任何问题时返回,目前这太宽泛了,就像一个不喜欢的“给我代码”类型的问题所以。我的建议是将其加载到 pandas df 中,然后查看 np.searchsorted 或其他搜索功能,并在遇到困难时返回
  • 让我解释得更好。应该为每一列寻找最接近的值。所以我如果输入'1200 1 2',它应该取第一个输入的数字(1200)并在这种情况下在第一列中寻找最接近的数字1000。然后它应该取第二个数字(1)并寻找最接近的数字第二列,但只有满足上限条件的行。第三个输入的数字也一样,所以最后它应该返回满足这些条件的最后一列的对应值。

标签: python pandas criteria multiple-columns


【解决方案1】:
  1. 打开文件,

    values = []
    with open("myfile.txt") as inf:
    
  2. 阅读每一行,

        for line in inf:
    
  3. 将其转换为数字,

            values.append([float(s) for s in line.split()])
    
  4. 定义“最接近”的含义。曼哈顿距离?最小二乘?

    def make_manhattan_dist_fn(from):
        def distance_fn(pt):
            return sum(abs(b-a) for a,b in zip(from, pt))
        return distance_fn
    
    my_dist_fn = make_manhattan_dist_fn([1200, 1, 2])
    

    编辑:根据您的评论,您想要

    def make_tuple_dist_fn(from):
        def distance_fn(pt):
            return tuple(abs(b - a) for a,b in zip(from, pt))
        return distance_fn
    
    my_dist_fn = make_tuple_dist_fn([1200, 1, 2])
    
  5. 找到最接近的值,

    print(min(values, key = my_dist_fn)[-1])
    

    导致

    3.0
    

【讨论】:

  • 非常感谢。这就是我一直在寻找的。​​span>
  • 是否可以在第二行和第三行具有相同值的数据之间进行线性插值?例如我的数据是:1000 100 2 0.1 1200 100 2 0.2 1000 80 3 0.4 我的输入是'1100 100 2',它应该返回0.15。
【解决方案2】:

也许是这样的?

from scipy.interpolate import griddata

input_data = [1100, 100, 4]
values = []

with open("prova.txt") as lista:

for line in lista:
    if line.find('RPM') == -1:
       values.append([float(s) for s in line.split()])

restricted = []
for i in range(len(values)):
    if values[i][2] == input_data[2]:
        restricted.append([values[i][0], values[i][1], values[i][3]])

points = []
valori = []

for i in range(len(restricted)):
    points.append( [restricted[i][0],restricted[i][1]] )
    valori.append( restricted[i][2] )


grid_x = input_data[0]
grid_y = input_data[1]

grid_z1 = griddata(points, valori, (grid_x, grid_y), method='linear')

“prova.txt”是:
1200 100 4 0.1
1150 100 4 0.1
1050 100 4 0.2
1000 100 4 0.2
1200 90 4 0.1
1150 90 4 0.1
1050 90 4 0.2
1000 90 4 0.2
1100 100 2 0.3

【讨论】:

    猜你喜欢
    • 2018-11-18
    • 1970-01-01
    • 2021-04-07
    • 2011-10-11
    • 2016-08-15
    • 1970-01-01
    • 2014-10-24
    • 2020-12-19
    • 1970-01-01
    相关资源
    最近更新 更多