Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在csv python中排序、分组和计算平均值_Python_Pandas_Csv_Sorting_Average - Fatal编程技术网

在csv python中排序、分组和计算平均值

在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

我有一个大的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.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!我设法对数据进行了排序,但找不到如何为每个集群平均数据的示例