我有一个大的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...
答案 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)