猿问

熊猫-对一组列进行分箱,然后对另一组列求和

我有一组价格和金额-其中amt1为price1的总体积。


对我来说,价格太精确了,我想根据价格将价格/金额对分组/合并/汇总到均匀分布的存储桶中,然后对金额进行求和。


例如,我原来的df:


index    price1 price2 price3 price4 amt1 amt2 amt3 amt4

1          451    454    462    470   10    1   2   5

2          448    452    458    464   8     2   6   2

3          461    463    468    480   1     3   6   9

4          453    455    471    481   4     3   2   4

将产生:


index bin1 bin2 bin3 bin4 bin5 amt1 amt2 amt3 amt4 amt5

1     440  450  460  470  480   0    11   2    5    0

2     440  450  460  470  480   8     8   2    0    0

3     440  450  460  470  480   0     0  10    0    9

4     440  450  460  470  480   0     7   0    2    4

几件事要注意:

  • 我选择将10装箱。

  • bin1表示440-449。

  • 价格始终按升序排列。

  • 我实际上有500个价格/体积对要计算(1000列df),因此需要扩展。

  • 速度实际上是优先考虑的事情(尽管乞g不能成为选择者)。

感谢任何帮助。


郎朗坤
浏览 133回答 1
1回答

慕尼黑5688855

首先创建带有组的扁平化DataFrame,以通过numpy.ravel和区分行numpy.repeat:a = df.filter(like='price').values.ravel()b = df.filter(like='amt').values.ravel()c = np.repeat(np.arange(len(df)), len(df.filter(like='price').columns))df = pd.DataFrame({'bin':a, 'amt':b, 'g':c})print (df)    bin  amt  g0   451   10  01   454    1  02   462    2  03   470    5  04   448    8  15   452    2  16   458    6  17   464    2  18   461    1  29   463    3  210  468    6  211  480    9  212  453    4  313  455    3  314  471    2  315  481    4  3然后按以下类别进行分类cut-我尝试按楼层分隔和多个依据动态创建标签和分类箱10,然后按以下方式聚合sum并整形unstack:val = (df['bin'] // 10)labels = np.arange(val.min() * 10, val.max() * 10 + 10, 10)bins = np.append(labels, val.max() * 10 + 10)df = (df.groupby(['g', pd.cut(df['bin'], bins=bins, labels=labels, right=False)])['amt'].sum()       .unstack(fill_value=0))print (df)bin  440  450  460  470  480g                           0      0   11    2    5    01      8    8    2    0    02      0    0   10    0    93      0    7    0    2    4上次创建预期格式df-添加新列,assign并使用已重命名的列添加join原始df列:cols1 = ['bin{}'.format(x) for x in range(1, len(df.columns) + 1)]cols2 = ['amt{}'.format(x) for x in range(1, len(df.columns) + 1)]d1= dict(zip(cols1, df.columns))d2= dict(zip(df.columns, cols2))df1 = pd.DataFrame(index=df.index).assign(**d1).join(df.rename(columns=d2))print (df1)   bin1  bin2  bin3  bin4  bin5  amt1  amt2  amt3  amt4  amt5g                                                            0   440   450   460   470   480     0    11     2     5     01   440   450   460   470   480     8     8     2     0     02   440   450   460   470   480     0     0    10     0     93   440   450   460   470   480     0     7     0     2     4
随时随地看视频慕课网APP

相关分类

Python
我要回答