python - 如何计算二维直方图中每个 bin 中每个唯一 ID 的出现次数(python 或 pandas)
问题描述
我有一个 csv 文件,我想创建一个 2d 直方图,其中每个 bin 中的值取决于唯一 ID。例如(见下文),对于范围 0<x<1 和 1<y<2,值是 2 (A, B) 而不是 3 (A, A, B),因为 A 出现了两次。谢谢!
ID | X | 是的 |
---|---|---|
一个 | 0.5 | 1.4 |
一个 | 0.6 | 1.6 |
一个 | 1.2 | 2.2 |
乙 | 0.7 | 1.7 |
C | 4.4 | 3.5 |
C | 3.1 | 3.7 |
解决方案
的一个 bin 可以唯一标识为i_x < x < j_x
; 我们可以看到这个元组对于每个 bin 都是唯一的。和只是 和 的底值。Like For row : bin is: , here and .i_y < y < j_y
(i_x, i_y)
i_x
i_y
x
y
(x, y) = (0.5, 1.4)
0 < 0.5 < 1
1 < 1.4 < 1.2
i_x = 0 = floor(0.5)
i_y = 1 = floor(1.4)
方法:
- 查找x
i_x
和i_y
y 列。 - 使用每个组中唯一的键
(i_x, i_y)
和计数对数据框进行IDs
分组。
代码:
>>> df
ID x y
0 A 0.5 1.4
1 A 0.6 1.6
2 A 1.2 2.2
3 B 0.7 1.7
4 C 4.4 3.5
5 C 3.1 3.7
df['bin_x'] = np.floor(df.x).astype(int)
df['bin_y'] = np.floor(df.y).astype(int)
df = (df.groupby(['bin_x', 'bin_y'], as_index = False)['ID']
.agg({'cnt' : 'nunique'}))
>>> df
bin_x bin_y cnt
0 0 1 2
1 1 2 1
2 3 3 1
3 4 3 1
如果您将直方图定义为大小为 (5, 5) 的 numpy 数组,那么我们可以为该cnt
数组分配值并获得所需的直方图。
histogram = np.zeros((5, 5))
histogram[df.bin_x, df.bin_y] = df.cnt
>>> histogram
array([[0., 2., 0., 0., 0.],
[0., 0., 1., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 1., 0.],
[0., 0., 0., 1., 0.]])