熊猫数据帧中每一行的变量箱

时间:2019-12-05 18:57:26

标签: python pandas dataframe cut bins

给出一个坐标数据框,例如df1 = pd.DataFrame({'x': np.tile(np.arange(20),5), 'y': np.repeat(np.arange(5),20)})

我想对每个x值进行装箱,但是,每行的装箱数不同。更具体地说,箱的数量取决于y值。

例如点x = 6和y = 2 如果箱数= y + 1 = 3 那么此行的垃圾箱是(0,6.33],(6.33,12.67],(12.67、19],结果垃圾箱是(0,6.33]

部分结果数据框如下:

x    y    xbinned
18   2    (12.67, 19]
19   2    (12.67, 19]
0    3    (0, 4.75]
1    3    (0, 4.75]

以下内容生成所需的垃圾箱:

xbins = []

for y in df1.y:
    xbins.append(np.linspace(df1['x'].min(), df1['x'].max(), y+1))

但不能用于剪切:

df['xbinned'] = pd.cut(df.x, bins=xbins)

因为它期望一个1d数组而不是2d。

我从这里去哪里?我想我可以使用循环来做到这一点,但我希望将pandas函数用于更矢量化的解决方案。

1 个答案:

答案 0 :(得分:1)

IIUC:

df1['xbinned'] = (df1.groupby('y')
                     .apply(lambda d: pd.cut(d['x'], bins=d['y'][0]+1))
                     .reset_index(level=0, drop=True)
                 )

输出(部分)

     x  y         xbinned
18  18  0  (-0.019, 19.0]
19  19  0  (-0.019, 19.0]
38  18  1     (9.5, 19.0]
39  19  1     (9.5, 19.0]