Сортировать, группировать и рассчитывать среднее значение в CSV Python - PullRequest
0 голосов
/ 04 июня 2018

У меня большой 4-колоночный CSV-файл со случайными значениями, и мне нужно сгруппировать строки по определенному идентификатору столбца, а затем усреднить координаты в другом файле.Кроме того, я хотел бы сохранить количество десятичных дробей.

ID, Latitude, Longitude, Cluster
1, 22.29124068, 19.59633257, 500
2, 22.28295135, 19.85912179, 214
3, 22.30154457, 19.65304535, 500
4, 22.29546953, 19.76508808, 214
5, 22.3322929, 19.75290081, 422
etc...

Итак, мне нужно вычислить среднюю координату из col [1] и col [2] для каждого уникального кластера col [3].в этот файл и вернуть результаты.

Выходной файл должен быть:

ID, Latitude, Longitude, Cluster
1, <average_latitude_214 cluster>, <average_longitude_214 cluster>, 214
1, <average_latitude_500 cluster>, <average_longitude_500 cluster>, 500
and so on...

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Если вы открыты для использования сторонней библиотеки, вы можете использовать pandas:

import pandas as pd

# read csv file
df = pd.read_csv('file_in.csv')

# perform groupby
res = df.groupby('Cluster')[['Latitude', 'Longitude']].mean().reset_index()

print(res)

#    Cluster   Latitude  Longitude
# 0      214  22.289210  19.812105
# 1      422  22.332293  19.752901
# 2      500  22.296393  19.624689

# write to csv
res.to_csv('file_out.csv', index=False)
0 голосов
/ 06 июня 2018

Вы можете использовать Python's defaultdict, чтобы создать список всех записей в одном кластере.Затем вы можете рассчитать среднее значение для каждого кластера и записать строку в выходной CSV-файл:

from collections import defaultdict
import csv

data = defaultdict(list)

with open('input.csv', newline='') as f_input:
    csv_input = csv.reader(f_input)
    header = next(csv_input)

    for row in csv_input:
        row[1] = float(row[1])
        row[2] = float(row[2])
        data[row[3]].append(row)

with open('output.csv', 'w', newline='') as f_output:        
    csv_output = csv.writer(f_output)
    csv_output.writerow(header)

    for id, (cluster, items) in enumerate(sorted(data.items()), start=1):
        latitude = sum(i[1] for i in items) / len(items)
        longitude = sum(i[2] for i in items) / len(items)

        csv_output.writerow([id, latitude, longitude, cluster])

Это создаст файл output.csv, содержащий:

ID,Latitude,Longitude,Cluster
1,22.289210439999998,19.812104935,214
2,22.3322929,19.75290081,422
3,22.296392625000003,19.62468896,500
...