Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 比较两个文件的列,将一个文件中不同列中的值替换为另一个文件中1列中的值_Python 3.x - Fatal编程技术网

Python 3.x 比较两个文件的列,将一个文件中不同列中的值替换为另一个文件中1列中的值

Python 3.x 比较两个文件的列,将一个文件中不同列中的值替换为另一个文件中1列中的值,python-3.x,Python 3.x,我已经找过了,但找不到类似的东西。我有一个空格分隔的TXT文件和一个标签分隔的CSV文件,如下所示 file1.txt(space delimited) a b c d e f b1 2 3 4 5 6 c7 8 9 3 2 1 d6 2 3 5 9 9 file2.csv (tab delimited) f G h s d6 0.2 0.7 9 b1 3 8 2 c7 2 2 7 我需要检查两个文件中的第1列。如果文件2中的任何第1列值等于文件1中的第1列

我已经找过了,但找不到类似的东西。我有一个空格分隔的TXT文件和一个标签分隔的CSV文件,如下所示

file1.txt(space delimited)
a b c d e f
b1 2 3 4 5 6
c7 8 9 3 2 1
d6 2 3 5 9 9

file2.csv (tab delimited)
f   G   h   s
d6  0.2 0.7 9
b1  3   8   2
c7  2   2   7
我需要检查两个文件中的第1列。如果文件2中的任何第1列值等于文件1中的第1列值, 我想用文件2第4列中的值替换文件1第3列中的值,并将整个内容写入 一个新文件。标题可以是任何内容,因此我无法按名称调用列。它不必在熊猫中,如果文件很大,希望有更好的方法

我当前的代码

import pandas as pd

f1 = pd.read_csv("f1.txt",delimiter =" ", header = None)
f2 = pd.read_csv("f2.csv",delimiter =" \t", header = 0)
with open("rr.csv", "w") as f:
    for i in f2.iloc[:, [0]].values:
        for x in f1.iloc[:, [0]].values:
            if i == x:
                f1.iloc[:, [2]].values = f2.iloc[:, [3]].values
                f1.to_csv(f, sep = " ", index = False)
            else:
                f1.to_csv(f, sep = " ", index = False)
预期结果:

a b c d e f
b1 2 9 4 5 6
c7 8 2 3 2 1
d6 2 7 5 9 9
我是在熊猫身上做的,但是我没有得到我想要的结果 我得到的是这个(我截短了,因为它太长了)


我很确定这正是你需要的。更大的数据样本会有所帮助。此脚本假定两件事:

首先,在相应的文件中总是有相同数量的列,并且这些文件总是由相同的字符(空格和相应的制表符)分隔

脚本从file one中加载每一行,剥离换行符,在空间上拆分行,然后一次读取整个第二行文件,在选项卡上拆分,并根据需要执行数据检查/写入。在第二个文件的末尾,指针重置为第二个文件的开头,然后第一个文件引入下一行以重复该过程

file1.txt

a b c d e f
b1 2 3 4 5 6
c7 8 9 3 2 1
d6 2 3 5 9 9
file2.txt

f   G   h   s
d6  0.2 0.7 9
b1  3   8   2
c7  2   2   7
parse.py

#!/usr/bin/env python3

f1 = open("file1.txt", "r")
f2 = open("file2.txt", "r")
out_f = open("output.txt", "w+")

for l_f1 in f1:
    test_line_1 = l_f1.strip("\n").split(" ")
    for l_f2 in f2:
        test_line_2 = l_f2.strip("\n").split("\t")
        if test_line_2[0] == test_line_1[0]:
            test_line_1[2] = test_line_2[3]
            out_f.write("\t".join(test_line_1) + "\n")
    f2.seek(0,0)

f1.close()
f2.close()
out_f.close()
output.txt

b1  2   2   4   5   6
c7  8   7   3   2   1
d6  2   9   5   9   9

这很好,但在一个文件中的列可能会更少,但我可以处理。此外,一旦进行比较,列中可能不会出现任何值。您可以添加一些简单的测试来处理特殊情况。是的,我当然打算这样做。但是append意味着即使我更改了要使用其值的列,它也会继续添加到输出中。e、 我使用文件1的第2列而不是第3列。结果将在新列的值之前添加第一个附加值。最好使用w+进行写入
b1  2   2   4   5   6
c7  8   7   3   2   1
d6  2   9   5   9   9