在csv python中排序、分组和计算平均值
我有一个大的4列csv文件,带有随机值,我需要根据特定的列ID对行进行分组,然后对另一个文件中的坐标进行平均。另外,我想保留小数的数目在csv python中排序、分组和计算平均值,python,pandas,csv,sorting,average,Python,Pandas,Csv,Sorting,Average,我有一个大的4列csv文件,带有随机值,我需要根据特定的列ID对行进行分组,然后对另一个文件中的坐标进行平均。另外,我想保留小数的数目 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
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...
ID、纬度、经度、集群
1, , 214
1, , 500
等等
您可以使用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、纬度、经度、集群
1,22.289210439999998,19.812104935,214
2,22.3322929,19.75290081,422
3,22.296392625000003,19.62468896,500
如果您愿意使用第三方库,您可以使用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)
令人惊叹的。。开始编码。如果遇到问题,请回来。所以是关于修正你的代码,而不是实现你的想法。请反复阅读,如果您有问题,请提供您的代码。如果您遇到错误,请将错误消息逐字复制并粘贴到您的问题中。谢谢@PatrickArtner!我设法对数据进行了排序,但找不到如何为每个集群平均数据的示例