在按hexbin函数将点分组的熊猫中查询数据

时间:2019-01-10 14:06:23

标签: python pandas numpy scipy seaborn

seaborn和panda都提供API,以便将二元直方图绘制为hexbin图(示例如下所示)。但是,我正在搜索执行查询以查找位于相同hexbin中的点。是否具有检索与hexbin中的数据点关联的行的功能?

举一个例子: 我的数据框包含3行:ABC。我使用sns.jointplot(x=A,y=B)绘制密度。现在,我想对位于同一bin中的每个数据点执行查询。例如,对于每个bin,计算与每个点关联的C值的平均值。

enter image description here

2 个答案:

答案 0 :(得分:1)

当前解决方案-快速破解

当前,我已经实现了以下函数,以将函数应用于与位于同一十六进制中的(x,y)坐标关联的数据:

def hexagonify(x, y, values, func=None):

    hexagonized_list = []

    fig = plt.figure()
    fig.set_visible(False)
    if func is not None:
        image = plt.hexbin(x=x, y=y, C=values, reduce_C_function=func)
    else:
        image = plt.hexbin(x=x, y=y, C=values)

    values = image.get_array()

    verts = image.get_offsets()
    for offc in range(verts.shape[0]):
            binx, biny = verts[offc][0], verts[offc][1]
            val = values[offc]
            if val:
                hexagonized_list.append((binx, biny, val))

    fig.clear()
    plt.close(fig)
    return hexagonized_list

值(与x或y大小相同)通过values参数传递。六边形是通过hexbin的{​​{1}}函数来计算的。通过返回的matplotlib的{​​{1}}函数检索值。默认情况下,get_array()函数将应用于每个bin的累积值。可以通过为PolyCollection参数提供功能来更改此功能。随后,np.mean方法使我们能够计算垃圾箱(discussed here)的中心。这样,我们可以关联(默认情况下)每个十六进制提供的值的平均值。但是,此解决方案是一个hack,因此欢迎对该解决方案进行任何改进。

答案 1 :(得分:0)

来自matplotlib

如果您已经绘制了图,则可以从matplotlib返回的polycollection中获取Bin Counts:

  

polycollection:一个PolyCollection实例;在此使用PolyCollection.get_array来获取每个六边形的计数。

此功能在以下位置也可用:

pandas

这里仅使用pandas可以处理C属性的MCVE:

import numpy as np
import pandas as pd

# Trial Dataset:
N=1000
d = np.array([np.random.randn(N), np.random.randn(N), np.random.rand(N)]).T
df = pd.DataFrame(d, columns=['x', 'y', 'c'])

# Create bins: 
df['xb'] = pd.cut(df.x, 3)
df['yb'] = pd.cut(df.y, 3)

# Group by and Aggregate:
p = df.groupby(['xb', 'yb']).agg('mean')['c']
p.unstack()

首先,我们使用pandas.cut创建垃圾箱。然后我们group by and aggregate。您可以选择要聚合agg的{​​{1}}函数(例如Cmax等)。

输出大约是:

median