2D bin(x,y)并计算10个最深数据点(z)的平均值(c)

2024-09-28 01:25:19 发布

您现在位置:Python中文网/ 问答频道 /正文

对于包含以下内容的数据集:

  • 坐标x,y
  • 深度z
  • 一定值c

我希望能更有效地做到以下几点:

  1. bin基于坐标(x,y)的二维bin中的数据集
  2. 每个箱子取最深的10个数据点(z)
  3. 计算每箱10个数据点的c平均值

最后显示一个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()

Tags: 数据importdfasnprangemathmin
1条回答
网友
1楼 · 发布于 2024-09-28 01:25:19

您可以使用np.searchsorted按x和y对行进行装箱,然后使用groupby获取10个深度值并计算平均值。由于groupby将维护每个组中的顺序,因此您可以在应用BIN之前对值进行排序。groupby在没有应用的情况下会表现更好

df = pd.DataFrame({'x':rand(n), 'y':rand(n), 'z':rand(n), 'c':rand(n)})

df = df.sort_values("z", ascending=False)
bins = np.linspace(0, 1, 11)
df["bin_x"] = np.searchsorted(bins, df['x'].values) - 1
df["bin_y"] = np.searchsorted(bins, df['y'].values) - 1

result = df.groupby(["bin_x", "bin_y"]).head(10)
result.groupby(["bin_x", "bin_y"])["c"].mean()

结果

bin_x  bin_y
0      0        0.369531
       1        0.601803
       2        0.554452
       3        0.575464
       4        0.455198
                  ...   
9      5        0.469838
       6        0.420772
       7        0.367549
       8        0.379200
       9        0.523083
Name: c, Length: 100, dtype: float64

相关问题 更多 >

    热门问题