我在此数据集的第一列(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
提供不同的值,但如何获得第一列中每个不同值的第二列的平均值?
答案 0 :(得分:2)
或者,假设您已安装Pandas,则会groupby为mean,如下所示:
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()}