在csv python中对平均值进行排序,分组和计算

时间:2018-06-04 15:32:32

标签: python pandas csv sorting average

我有一个大的4列csv文件,带有随机值,我需要按特定列ID对行进行分组,然后在另一个文件中对coordonates求平均值。另外,我想保留小数位数。

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 [3]的col [1]和col [2]的平均坐标并返回结果。

输出文件应为:

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 :(得分:1)

您可以使用Python的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

答案 1 :(得分:1)

如果您愿意使用第三方库,则可以使用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)