有没有一种有效的方法可以根据熊猫的散布数据创建色目?

时间:2019-09-05 16:24:55

标签: python pandas numpy matplotlib

我有一个这样的熊猫数据框;

X   Y  VALUE
140 45 124
15 129 219
189 90 125

我正在尝试通过将每个“网格”中的所有value相加来从此数据帧创建2D彩色网格。现在我正在通过

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

step = 5
xx = np.arange(0, 200+step, step)
yy = np.arange(0, 200+step, step)
array = np.empty(xx.size * yy.size)
ctr = 0
for y in np.nditer(yy):
    for x in np.nditer(xx):
        grid = df[(df['X'] >= x) & (df['X'] < x + step) \
                & (df['Y'] >= y) & (df['Y'] < y + step)]
        value_sum = grid['VALUE'].sum() if not grid.empty else 0
        array[ctr] = value_sum
        ctr += 1
mesh = array.reshape((yy.size, xx.size))
plt.pcolormesh(xx, yy, mesh)

这确实达到了我的目的,但是由于我使用的是Python for循环,因此速度非常慢。有没有一种方法可以使用numpy广播功能来避免使用python for循环并创建相同的网格物体(ndarray)?

2 个答案:

答案 0 :(得分:0)

您可能希望使用值作为权重来研究np.histogram2d

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

import random

xs = [random.randrange(0,201,1) for _ in range(100)]
ys = [random.randrange(0,201,1) for _ in range(100)]
value = [random.randrange(0,500,1) for _ in range(100)]

hist, xedges, yedges = np.histogram2d(xs, ys, bins=42, range=None, normed=None, weights=value, density=None)
plt.pcolormesh(xedges, yedges, hist)

这比计算机上的循环版本快10倍。

答案 1 :(得分:0)

像这样简单的事情怎么样?

mesh = np.zeros((len(xx), len(yy)))
for row in df.itertuples():
    mesh[row.Y//step, row.X//step] = row.VALUE
plt.pcolormesh(yy, xx, mesh)