现在我们有一个存储大量坐标的二维列表,想要求出每一行坐标的均值。如果用for循环的话,程序运行时间会非常长。上网查了很久,发现可以用pandas包DataFrame().groupby()函数。
求每一行的均值,也就是对y坐标相同的所有x坐标求平均数,代码如下:
L = [[1, 1], [1, 5], [2, 1], [2, 3],[1, 3]]
L1 = pd.DataFrame(L).groupby(1, as_index=False).mean().values.tolist()
L1=np.array(L1)
L1=L1[:,[1,0]]
print(L1)
如果相对x坐标相同的点,求y的均值,则可以:
L = [[1, 1], [1, 5], [2, 1], [2, 3],[1, 3]]
L1 = pd.DataFrame(L).groupby(0, as_index=False).mean().values.tolist()
print(L1)
最关键的就是第二行代码。两次唯一的区别就是,求y坐标相同的x均值时,得到的列表元素顺序颠倒了(我也不知道为什么),必须把两列交换过来,才会变成正确的坐标列表。因此第一段代码把L1变成了np.array,而第二段代码的结果仍是list。
还有另外一种方法交换列表的两列:
aa,bb=[],[]
for x,y in L1:
aa.append(y)
bb.append(x)
w=np.array([aa,bb]).transpose()
实验发现,第二种方法反而比第一种方法的速度快一点点(都很快了),虽然第一种看起来简单多了。
除了求均值以外,还有DataFrame().groupby().max()等其他方法,适用于大量数据的计算。
哦对了,别忘了import pandas as pd