Сортировка и присвоение координат в CSV переменных - PullRequest
2 голосов
/ 05 августа 2020

У меня есть следующие данные в CSV. Я пытаюсь присвоить каждой метке точки (ie в точке 1 или точке 2) правильную координату, используя Python. Я использую библиотеку csv, но думаю, что Pandas тоже может быть эффективным.

Для каждого уникального значения FAF, изображения и Grid (x) и Grid (y) есть две точки. Хотя координаты (точка 1 или 2, (x) или (y)) верны, привязка метки к координатам неверна. Я хочу, чтобы мой код читал CSV и на основе других строк с тем же «идентификатором» (FAF + Image + Grid (x) + Grid (y)) присваивал метку общей точки общей паре координат. Например, в первом «ID» (Left, left, S1, N1) OD соответствует 1755, 1976 и, следовательно, другая метка в данной строке соответствует другой точке в этой строке (ie RX равно (1615 , 1976)).

Здесь мои данные: https://www.dropbox.com/s/h72qv2s31lubili/Measurements%20-%20STKO.csv?dl=0

Вот мой код:

with open(csv_file, 'r') as file:
        reader = csv.DictReader(file)
        for line in reader:
            FAF = line["FAF"]
            image = line["image"]
            Grid_x = line["Grid (x)"]
            Grid_y = line["Grid (y)"]
            point1 = line["Point 1"]
            point1_x = line["Point 1 (x)"]
            point1_y = line["Point 1 (y)"]
            point1 = line["Point 1"]
            point1_x = line["Point 1 (x)"]
            point1_y = line["Point 1 (y)"]
            point2 = line["Point 2"]
            point2_x = line["Point 2 (x)"]
            point2_y = line["Point 2 (y)"]
            ID = str(FAF) + "_" + str(image) + "_" + str(Grid_x) + "_" + str(Grid_y)
            print(ID)
            
        

Не знаю, как теперь пролистайте каждую строку и присвойте общие метки переменных общим координатам.

введите описание изображения здесь

1 Ответ

0 голосов
/ 05 августа 2020
import pandas as pd

# Create DataFrame
data = pd.read_csv('STKO.csv')
df = pd.DataFrame(data)

# Add temporary columns that combine original columns
df['id'] = df['FAF'] + df['image'] + df['Grid (x)'] + df['Grid (y)'] + df['Point 1'] 
df['pt1'] = df[['Point 1 (x)', 'Point 1 (y)']].apply(tuple, axis=1)
df['pt2'] = df[['Point 2 (x)', 'Point 2 (y)']].apply(tuple, axis=1)

# Create list of correct coordinates for Point 1
# by choosing coordinate that is in each row
correct_pts = []
for grp in df.groupby('id'):
    for pt in grp[1]['pt1']:
        num_pts = list(grp[1]['pt1']).count(pt) + list(grp[1]['pt2']).count(pt)
        if num_pts == len(grp[1]):
            correct_pts.append([grp[0],pt])
            break

# Convert list to DataFrame
df1 = pd.DataFrame(correct_pts, columns=['id','coords'])

# Merge into original DataFrame
df = pd.merge(df, df1, how='left', on='id')

# Swap erroneous coordinates with correct coordinates (in temp columns)
df.loc[df['pt1']!=df['coords'], ['pt1', 'pt2']] = df.loc[df['pt1']!=df['coords'], ['pt2', 'pt1']].values

# Update original coordinates
df[['Point 1 (x)', 'Point 1 (y)']] = pd.DataFrame(df['pt1'].tolist(), index=df.index)     
df[['Point 2 (x)', 'Point 2 (y)']] = pd.DataFrame(df['pt2'].tolist(), index=df.index)  

# Drop temp columns
df = df.drop(columns=['id', 'pt1', 'pt2', 'coords'])

# Write to CSV file
data = df.to_csv('STKO_new.csv', index=False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...