获得不同列表值的平均值

时间:2015-05-05 01:03:40

标签: python list

我在此数据集的第一列(link)创建的列表中有4k值:

11 1
19 1
42 2
16 1
63 3
14 1
11 1
83 4
63 3
11 1
13 1
17 1
92 4
11 2
86 2 

等等

我想转换不同列表中的第一列以及它的相应第二个值的平均值。

方法1:循环到最后一行并检查条件,如果相似的值则增加计数并在第二列中添加值。最后除以计数

Apprach 2:将col1转换为列表

col1 = list(set(col1))将为col1提供不同的值,但如何获得第一列中每个不同值的第二列的平均值?

2 个答案:

答案 0 :(得分:2)

或者,假设您已安装Pandas,则会groupbymean,如下所示:

import pandas as pd
import io

s = '''11 1
19 1
42 2
16 1
63 3
14 1
11 1
83 4
63 3
11 1
13 1
17 1
92 4
11 2
86 2 '''
# using your sample data
df = pd.read_table(io.StringIO(s), header=None, sep=' ')    

df
Out[5]: 
     0  1
0   11  1
1   19  1
2   42  2
3   16  1
4   63  3
5   14  1
6   11  1
7   83  4
8   63  3
9   11  1
10  13  1
11  17  1
12  92  4
13  11  2
14  86  2

使用groupby对作为第一列值的列0进行分组,它们将是不同的,然后mean将应用于列1来计算它们相对平均值:

df.groupby(0).mean()
Out[6]: 
       1
0       
11  1.25
13  1.00
14  1.00
16  1.00
17  1.00
19  1.00
42  2.00
63  3.00
83  4.00
86  2.00
92  4.00

作为附注 Pandas read_table()read_csv()等可以从文件路径和文件缓冲区中读取。我上面的示例仅仅是使用内存缓冲区。

答案 1 :(得分:1)

我建议使用第一列值作为键来构建defaultdict(),并使用第二列中的值列表。然后循环遍历defaultdict并计算平均值。

像这样:

from collections import defaultdict

d = defaultdict(list)

with open('data.txt') as f:
    for line in f:
        key, value = (int(x) for x in line.split())
        d[key].append(value)

def mean(lst):
    if not lst: return 0
    return float(sum(lst)) / len(lst)

mean_values = {key: mean(lst) for key, lst in d.iteritems()}