首页 > 解决方案 > Pandas Dataframe:多维分箱

问题描述

假设我有一个数据框 df,它由一个由两个对象组成的类S、一组与它们相关联的坐标XY以及一个V在那里测量的值 。

例如,数据框如下所示:

S X Y V
0 3 3 1
0 4 3 2
1 6 0 1
1 3 3 8

我想知道允许我在新的分箱中对与类关联的坐标X和坐标进行分组的命令。在这张新图片中, 的新值应该是每个类别的 bin 中的值的总和,。YSVS

例如,假设这个坐标系最初分别在 0 和 10 之间分XY。我想将它放在 0 和 2 之间。这意味着:

编辑:

再举个例子,考虑 Dataframe df

  1. 第 1 行有X = 3Y = 3。由于0 < X <= 5and 0 < Y <= 5,这属于 bin(0,0)
  2. 第 2 行有X = 4Y = 3。由于0 < X <= 5and 0 < Y <= 5,这也落入了 bin (0,0)
  3. 由于第 1 行和第 2 行是在同一个 bin 中观察到的并且属于同一类S,因此它们沿 column 添加V。这给出了一个组合行,X=0, Y=0, V = 1+2 =3

  4. 第 3 行有X = 6Y = 0。由于6 < X <= 10and 0 < Y <= 5,这属于 bin(1,0)

  5. 第 4 行有X= 3Y = 3。由于0 < X <= 5and 0 < Y <= 5,这属于 bin (0,0)。但是,由于元素属于 class S=1,它没有添加到任何东西,因为我们只是在共享类之间添加。

输出应该是:

S X Y V
0 0 0 3
0 1 0 1
1 0 0 8

我必须使用什么命令来实现这一点?

标签: pythonpandasdataframe

解决方案


这应该可以解决问题:

data.loc[data['X'] <= 5, 'X'] = 0
data.loc[data['X'] > 5, 'X'] = 1
data.loc[data['Y'] <= 5, 'Y'] = 0
data.loc[data['Y'] > 5, 'Y'] = 1

data = data.groupby(['S', 'X', 'Y']).sum().reset_index()

对于您的示例,输出为:

   S  X  Y  V
0  0  0  0  3
1  1  0  0  8
2  1  1  0  1

我发现这个答案很有帮助。


推荐阅读