我已经搜索过,但找不到类似的内容。我有一个以空格分隔的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列。如果file2中的任何列1值等于file1中的列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
我在大熊猫上做到了,但没有得到预期的结果 我得到的是这个(我被截断了,因为它太长了)
0 1 2 3 4 5
a b c d e f
b1 2 3 4 5 6
c7 8 9 3 2 1
d6 2 3 5 9 9
0 1 2 3 4 5
a b c d e f
b1 2 3 4 5 6
c7 8 9 3 2 1
d6 2 3 5 9 9
0 1 2 3 4 5
a b c d e f
b1 2 3 4 5 6
答案 0 :(得分:1)
我很确定这可以满足您的需求。更大的数据样本会有所帮助。该脚本假设两件事:
首先,各个文件中的列数始终相同,并且这些文件始终由相同的字符(空格和制表符)分隔
该脚本从文件1加载每一行,剥离换行符,在空间上拆分该行,然后一次读取整个第二个文件行,在选项卡上拆分它,并根据需要进行数据检查/写入。在第二个文件的末尾,指针将重置为第二个文件的开头,然后第一个文件进入下一行以重复该过程。
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