行数相等的平均值

时间:2015-10-15 11:44:52

标签: python numpy pandas

我有以下数据(示例)

ModelForm

并且需要消除# x y z 1 1 2 1 2 3 1 1 4 2 3 5 3 5 6 x中的重复项。 要做到这一点并且没有松散的信息,我将计算y的最后一个元素的平均值,但前提是第一列和第二列相等。例如上面例子的结果 应该是

array

到目前为止,我以非常1 1 3 # mean of 2 and 4 1 2 3 2 3 5 3 5 6 的方式解决了这个问题:

unpythonic

我的解决方案很慢......而且很难看。 有没有更好的方法来解决这个问题? data = np.loadtxt('somefile') # 2D data X = data[:, 0] Y = data[:, 1] x_new = [] y_new = [] z_new = [] for x in X: for y in Y: new_data = data[np.logical_and(data[:, 0] == x, data[:, 1] == y)] if len(new_data) >= 2: # some duplicates here z_mean = np.mean(new_data[:, -1]) x_new.append(x) y_new.append(y) z_new.append(z_mean)

编辑:该示例可能具有误导性,然后在此特定情况下Pandas等于x。但有趣的情况当然是点y重复的地方。

1 个答案:

答案 0 :(得分:3)

如果您可以使用pandas并将data设置为DataFrame,则可以使用DataFrame.groupby轻松完成此操作。示例 -

newdf = df.groupby(['x','y']).mean().reset_index()

演示 -

In [186]: df
Out[186]:
   x  y  z
0  1  1  2
1  1  2  3
2  1  1  4
3  2  3  5
4  3  5  6

In [187]: newdf = df.groupby(['x','y']).mean().reset_index()

In [188]: newdf
Out[188]:
   x  y  z
0  1  1  3
1  1  2  3
2  2  3  5
3  3  5  6

如果x / y / z是numpy数组或列表,那么您可以使用 -

轻松创建数据框
df = pd.DataFrame({'x':xarray,'y':yarray,'z':zarray})

如果data是2-D numpy数组,则可以 -

df = pd.DataFrame(data,columns=['x','y','z'])

为了给出一个更清晰的例子,让我们说data就像 -

x y z
1 1 2
1 2 3
1 2 4
2 3 5
3 5 6

然后,上述建议的结果将是(1,2)组,并取34的平均值3.5

演示 -

In [4]: df
Out[4]:
   x  y  z
0  1  1  2
1  1  2  3
2  1  2  4
3  2  3  5
4  3  5  6

In [5]: newdf = df.groupby(['x','y']).mean().reset_index()

In [6]: newdf
Out[6]:
   x  y    z
0  1  1  2.0
1  1  2  3.5
2  2  3  5.0
3  3  5  6.0