熊猫如何在没有分类值范围的情况下进行 bin 和 groupby

问题描述

我有大量的纬度和经度值,我想将它们合并在一起以便在热图上显示它们(ipyleaflet 似乎只允许热图中 2000 个左右的点,这也将是使用大数据时效率更高)。

我实际上使用的是 vaex,但是 pandas 方面的答案也很好。

pandas pd.cut 函数在分箱方面似乎很有帮助,但是它会生成一个分类列 (category dtype),看起来像所有箱中的值。是否有某种方法可以将其更改为仅标识每个垃圾箱的增量数字(感谢 jezreal 提供的那部分答案)?我只需要一个 bin 编号,然后 groupby 纬度和经度列上的 bin 编号和平均值 (mean)。我还需要计算热图条目的强度。

例如:

dft = pd.DataFrame({
    'latitude': [1.5,0.5,1.2,0.9,3],'longitude': [3,0.2,2,1.1]
    })

dft['bin'] = pd.cut(dft['latitude'],bins=3,labels=False).astype(str) + "_" + pd.cut(dft['longitude'],labels=False).astype(str)

dft.groupby('bin').agg(['mean','count']).unstack()

Almost gives me the answer,but I think I want this output instead:

bin latitude_mean longitude_mean count
0_0 0.7           0.2            2
0_1 1.2           2.0            1
1_2 1.5           3.0            1
2_0 3.0           1.1            1 

如果计数可以在 1 到 1000 之间归一化会很有帮助。

如何使用 pandas pd.cut 或其他东西来groupby 行中的 bin、纬度和经度的平均值以及列中的(热图强度)计数?

>

解决方法

pandas pd.cut 函数似乎在分箱方面很有帮助,但是它会生成一个分类列(类别 dtype),它看起来像一个 bin 中所有值的列表。是否有某种方法可以将其更改为标识每个垃圾箱的增量数字

是的,在 cut 中使用 label=False 参数:

labels 数组或 False,默认无
指定返回的 bin 的标签。必须与生成的 bin 长度相同。如果为 False,则仅返回 bin 的整数指示符。

最后使用 GroupBy.agg 进行聚合并最后标准化 count 列:

df = dft.groupby('bin').agg(latitude_mean=('latitude','mean'),longitude_mean=('longitude',count=('latitude','count'))

#https://stackoverflow.com/a/50028155/2901002
a,b = 1,1000
x,y = df['count'].min(),df['count'].max()
df['count'] = (df['count'] - x) / (y - x) * (b - a) + a

print (df)

     latitude_mean  longitude_mean   count
bin                                       
0_0            0.7             0.2  1000.0
0_1            1.2             2.0     1.0
1_2            1.5             3.0     1.0
2_0            3.0             1.1     1.0

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...