我有一个python数据集作为列表,其中列表中的每个单独条目都是另一个包含x和y值的列表。我试图在不同的x值(存储在另一个列表中)中计算所有y的均值。
data_set = [[1,25],[1,30],[1,35],[1,40],[1,45]
,[2,35],[2,40],[2,44],[2,50],[2,55],[2,58]
,[3,49],[3,54],[3,60],[3,64],[3,68]
,[4,50],[4,63],[4,65],[4,73],[4,78],[4,83],[4,85]
,[5,72],[5,77],[5,80],[5,86],[5,88],[5,95]]
但是我无法让代码遍历整个数据集。
def prf_mean(list):
mean_list = []
temp_list = []
counter = 1
for i in list:
if i[0]==counter:
temp_list.append(i)
else:
temp_var = 0
for i in temp_list:
temp_var +=i[1]
mean_list.append(temp_var / len(temp_list))
temp_list.clear()
counter += 1
return (mean_list)
prf_mean(data_set)
代码为x = 1提供了准确的均值,但是对于更高的x,结果是错误的(因为它们被错误的数字除以),并且x = 5完全没有显示。
答案 0 :(得分:1)
我建议使用字典作为此问题的数据结构。下面的示例将您的data_set转换为字典,然后为每个x计算平均值y。
ByteArrayOutputStream boas = new ByteArrayOutputStream();
WritableByteChannel output = Channels.newChannel(new DataOutputStream(boas));
UnparseResult result = dataProcessor.unparse(inputter, output);
System.out.println(boas.toString());
答案 1 :(得分:0)
如果您对项目进行排序(或者如果您可以依靠它们现在的排序方式),则可以使用itertools.groupby
将其分组为基于x值的单位。然后只需找到每个组的平均值即可:
from itertools import groupby
data_set = [[1,25],[1,30],[1,35],[1,40],[1,45]
,[2,35],[2,40],[2,44],[2,50],[2,55],[2,58]
,[3,49],[3,54],[3,60],[3,64],[3,68]
,[4,50],[4,63],[4,65],[4,73],[4,78],[4,83],[4,85]
,[5,72],[5,77],[5,80],[5,86],[5,88],[5,95]]
for k, g in groupby(sorted(data_set), key=lambda x: x[0]):
n = [x[1] for x in g]
av = sum(n)/len(list(n))
print (f"{k} average: {av}")
此打印:
1 average: 35.0
2 average: 47.0
3 average: 59.0
4 average: 71.0
5 average: 83.0
因为groupby是一个迭代器,所以如果您的数据已经排序,则有可能无需在内存中保存整个数据集就可以计算均值,如果数据集很大的话(例如从磁盘读取数据)就很好了。
答案 2 :(得分:0)
这是另一种方式。
data_set = [[1,25],[1,30],[1,35],[1,40],[1,45]
,[2,35],[2,40],[2,44],[2,50],[2,55],[2,58]
,[3,49],[3,54],[3,60],[3,64],[3,68]
,[4,50],[4,63],[4,65],[4,73],[4,78],[4,83],[4,85]
,[5,72],[5,77],[5,80],[5,86],[5,88],[5,95]]
all_means = {}
for i in range(1, 6):
means = []
for j in data_set:
if j[0] == i:
means.append(j[1])
all_means[i] = sum(means) / len(means)
print(all_means)
输出:
{1: 35.0, 2: 47.0, 3: 59.0, 4: 71.0, 5: 83.0}
答案 3 :(得分:0)
这是功能编程方式:
data_set = [[1,25],[1,30],[1,35],[1,40],[1,45]
,[2,35],[2,40],[2,44],[2,50],[2,55],[2,58]
,[3,49],[3,54],[3,60],[3,64],[3,68]
,[4,50],[4,63],[4,65],[4,73],[4,78],[4,83],[4,85]
,[5,72],[5,77],[5,80],[5,86],[5,88],[5,95]]
f = lambda arg, n: list(map(lambda k: list(map(lambda j: j[1],
list(filter(lambda i: i[0] == k, arg)))), range(1, n + 1)))
for i in f(data_set, 5):
print(sum(i) / len(i))
输出:
35.0
47.0
59.0
71.0
83.0