我有以下数据(示例)
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
重复的地方。
答案 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)
组,并取3
和4
的平均值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