Сравните два файла, если они оба соответствуют первому столбцу, затем замените значения столбца 2 и 3 (Python) - PullRequest
0 голосов
/ 28 мая 2020

Есть два файла. Если номер идентификатора совпадает с обоими файлами, то мне нужны только значения 1 и 2 из File2.txt. Сообщите мне, если мой вопрос неясен

File1.txt


ID Number   Value 1     Value 2     Country 
0001        23            55        Spain
0231        15            23        USA     
4213        10            11        Canada
7541        32            29        Italy

File2.txt

0001        5       6
0231        7       18
4213        54      87
5554        12      10
1111        31      13
6422        66      51

Результат должен выглядеть следующим образом.

ID Number   Value 1     Value 2     Country 
0001          5           6         Spain
0231          7          18         USA     
4213          54         87         Canada
7541          32         29         Italy

Новый пример:

File3.txt

#ID CAT CHN LC SC LATITUDE LONGITUDE 
20022 CX 21 --   4  32.739000  -114.635700 
01711 CX 21 --   3  32.779700  -115.567500
08433 CX 21 --   2  31.919930  -123.321000


File4.txt

20022,32.45,-114.88
01192,32.839,-115.487
01711,32.88,-115.45
01218,32.717,-115.637

output
#ID CAT CHN LC SC LATITUDE LONGITUDE 
20022 CX 21 --   4  32.45  -114.88 
01711 CX 21 --   3  32.88  -115.45
08433 CX 21 --   2  31.919930  -123.321000

Код, который я получил до сих пор

f = open("File3.txt", "r") 
x= open("File4.txt","r")

df1 = pd.read_csv(f, sep=' ', engine='python')
df2 = pd.read_csv(x, sep=' ', header=None, engine='python')

df2 = df2.set_index(0).rename_axis("#ID")
df2 = df2.rename(columns={5:'LATITUDE', 6: 'LONGITUDE'})
df1 = df1.set_index('#ID')
df1.update(df2)
print(df1)

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Возможно, что-то вроде этого:

file1_data = []
file1_headers = []

with open("File1.txt") as file1:
    for line in file1:
        file1_data.append(line.strip().split("\t"))
    file1_headers = file1_data[0]
    del file1_data[0]

file2_data = []

with open("File2.txt") as file2:
    for line in file2:
        file2_data.append(line.strip().split("\t"))

file2_ids = [x[0] for x in file2_data]

final_data = [file1_headers] + file1_data

for i in range(1, len(final_data)):
    if final_data[i][0] in file2_ids:
        match = [x for x in file2_data if x[0] == final_data[i][0]]
        final_data[i] = [match[0] + [final_data[i][3]]]

with open("output.txt", "w") as output:
    output.writelines(["\t".join(x) for x in final_data])

final_data становится псевдонимом file1_data, а затем выборочно заменяет строки соответствующими идентификаторами в file2_data, но сохраняет страну.

0 голосов
/ 28 мая 2020

Хорошо, что вам здесь нужно сделать, так это добиться соответствия индексов в обоих фреймах данных после импорта. Это важно, потому что pandas использует выравнивание данных на основе индексов.

Вот полный пример с вашими данными:

from io import StringIO
import pandas as pd

File1txt=StringIO("""ID Number   Value 1     Value 2     Country 
0001        23            55        Spain
0231        15            23        USA     
4213        10            11        Canada
7541        32            29        Italy""")


File2txt = StringIO("""0001        5       6
0231        7       18
4213        54      87
5554        12      10
1111        31      13
6422        66      51""")

df1 = pd.read_csv(File1txt, sep='\s\s+', engine='python')
df2 = pd.read_csv(File2txt, sep='\s\s+', header=None, engine='python')

print(df1)
#    ID Number  Value 1  Value 2 Country
# 0          1       23       55   Spain
# 1        231       15       23     USA
# 2       4213       10       11  Canada
# 3       7541       32       29   Italy

print(df2)
#       0   1   2
# 0     1   5   6
# 1   231   7  18
# 2  4213  54  87
# 3  5554  12  10
# 4  1111  31  13
# 5  6422  66  51

df2 = df2.set_index(0).rename_axis('ID Number')
df2 = df2.rename(columns={1:'Value 1', 2: 'Value 2'})
df1 = df1.set_index('ID Number')
df1.update(df2)
print(df1.reset_index())

Вывод:

   ID Number  Value 1  Value 2 Country
0          1      5.0      6.0   Spain
1        231      7.0     18.0     USA
2       4213     54.0     87.0  Canada
3       7541     32.0     29.0   Italy
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...