对于包含以下内容的数据集:
我希望能更有效地做到以下几点:
最后显示一个2d热图和计算出的平均值
我已经找到了一个可行的解决方案,但对于小型存储箱和/或大型数据集来说,这需要很长时间
有没有更有效的方法达到同样的效果
数据帧示例:
import numpy as np
from numpy.random import rand
import pandas as pd
import math
import matplotlib.pyplot as plt
n = 10000
df = pd.DataFrame({'x':rand(n), 'y':rand(n), 'z':rand(n), 'c':rand(n)})
Bin数据集:
cell_size = 0.01
nx = math.ceil((max(df['x']) - min(df['x'])) / cell_size)
ny = math.ceil((max(df['y']) - min(df['y'])) / cell_size)
x_range = np.arange(0, nx)
y_range = np.arange(0, ny)
df['xbin'], x_edges = pd.cut(x=df['x'], bins=nx, labels=x_range, retbins=True)
df['ybin'], y_edges = pd.cut(x=df['y'], bins=ny, labels=y_range, retbins=True)
现在需要很长时间的代码:
df = df.groupby(['xbin', 'ybin']).apply(
lambda d: d.sort_values('z').head(10).mean())
为没有数据的箱子更新空数据框并显示结果:
index = pd.MultiIndex.from_product([x_range, y_range],
names=['xbin', 'ybin'])
tot_df = pd.DataFrame(index=index, columns=['z', 'c'])
tot_df.update(df)
zval = tot_df['c'].astype('float').values
zval = zval.reshape((nx, ny))
zval = zval.T
zval = np.flipud(zval)
extent = [min(x_edges), max(x_edges), min(y_edges), max(y_edges)]
plt.matshow(zval, aspect='auto', extent=extent)
plt.show()
您可以使用
np.searchsorted
按x和y对行进行装箱,然后使用groupby获取10个深度值并计算平均值。由于groupby将维护每个组中的顺序,因此您可以在应用BIN之前对值进行排序。groupby在没有应用的情况下会表现更好结果
相关问题 更多 >
编程相关推荐