在python中从csv按键查找平均值

在python中从csv按键查找平均值,python,csv,average,Python,Csv,Average,我有一个简单的2列csv,需要找到每个键的平均值 即 输入csv A,2 B,3 A,1 C,2 B,2 D,4 C,2 所需输出 {'A': 1.5, 'B': 2.5, 'C': 2, 'D': 4} 迄今为止的守则: pythoncsvfile = open("data.csv") csv_reader = csv.reader(csvfile, delimiter=',') for row in csv_reader: print (row[0],row[1]) 选

我有一个简单的2列csv,需要找到每个键的平均值 即 输入csv

A,2
B,3
A,1
C,2
B,2
D,4
C,2
所需输出

{'A': 1.5, 'B': 2.5, 'C': 2, 'D': 4}

迄今为止的守则:

pythoncsvfile = open("data.csv") 
csv_reader = csv.reader(csvfile, delimiter=',') 
for row in csv_reader: 
    print (row[0],row[1])

选项A

使用
csv

import csv
import collections

out = collections.defaultdict(list)
with open('file.csv') as f:
    for line in csv.reader(f):
        out[line[0]].append(int(line[1]))

for k in out: 
    out[k] = sum(out[k]) / len(out[k])

print(dict(out))

{'A': 1.5, 'B': 2.5, 'C': 2.0, 'D': 4.0}

选项B

使用
pandas

import pandas as pd

df = pd.read_csv('file.csv', header=None, names=['Key', 'Value'])
out = df.groupby('Key').mean()

print(out.Value.to_dict())

{'A': 1.5, 'B': 2.5, 'C': 2.0, 'D': 4.0}

选项A

使用
csv

import csv
import collections

out = collections.defaultdict(list)
with open('file.csv') as f:
    for line in csv.reader(f):
        out[line[0]].append(int(line[1]))

for k in out: 
    out[k] = sum(out[k]) / len(out[k])

print(dict(out))

{'A': 1.5, 'B': 2.5, 'C': 2.0, 'D': 4.0}

选项B

使用
pandas

import pandas as pd

df = pd.read_csv('file.csv', header=None, names=['Key', 'Value'])
out = df.groupby('Key').mean()

print(out.Value.to_dict())

{'A': 1.5, 'B': 2.5, 'C': 2.0, 'D': 4.0}

我认为您可以使用以下代码:

import csv
from collections import OrderedDict

data = OrderedDict()

with open('data.csv', 'rb') as csvfile:
    content = csv.reader(csvfile, delimiter=',')
    for index, value in content:
        if ( not data.has_key(index) ):
            #initialize
            data[index] = {'times':1, 'total':float(value)}
        else:
            #index already present
            data[index] = {'times': data[index]["times"]+1, 'total':data[index]["total"]+float(value)}

def average(data):
    results = OrderedDict()

    for index, values in data.iteritems():
        results[index] = values["total"]/values["times"]

    return results

print average(data)
数据的示例结果:
HTH

我认为您可以使用以下代码:

import csv
from collections import OrderedDict

data = OrderedDict()

with open('data.csv', 'rb') as csvfile:
    content = csv.reader(csvfile, delimiter=',')
    for index, value in content:
        if ( not data.has_key(index) ):
            #initialize
            data[index] = {'times':1, 'total':float(value)}
        else:
            #index already present
            data[index] = {'times': data[index]["times"]+1, 'total':data[index]["total"]+float(value)}

def average(data):
    results = OrderedDict()

    for index, values in data.iteritems():
        results[index] = values["total"]/values["times"]

    return results

print average(data)
数据的示例结果:
HTH

这是一个好的、明确的问题陈述。现在,试着编写一些代码来实现它。如果您陷入困境,请告诉我们您陷入困境的原因和原因。您是否有
pandas
?您是否考虑过合适的容器数据类型?这是一个很好的、明确的问题陈述。现在,试着编写一些代码来实现它。如果您陷入困境,请告诉我们您陷入困境的原因和原因。您是否有
pandas
?您是否考虑过合适的容器数据类型可能是什么?很好的解决方案,但我想知道为什么您将
设置为\u index=False
。如果不这样做,则可以说
out.Value.to_dict()
以获取请求的格式OP。@JohnZwinck
列成为索引。我不喜欢那样子。真的,仅此而已p@JohnZwinck但这是个好主意:)谢谢。@cᴏʟᴅsᴘᴇᴇᴅ 谢谢我选择了选项A,效果非常好。@user8420144很高兴我能帮上忙!很好的解决方案,不过我想知道为什么将
设置为_index=False
。如果不这样做,则可以说
out.Value.to_dict()
以获取请求的格式OP。@JohnZwinck
列成为索引。我不喜欢那样子。真的,仅此而已p@JohnZwinck但这是个好主意:)谢谢。@cᴏʟᴅsᴘᴇᴇᴅ 谢谢我选择了选项A,效果非常好。@user8420144很高兴我能帮上忙!