亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

熊貓-對一組列進行分箱,然后對另一組列求和

熊貓-對一組列進行分箱,然后對另一組列求和

郎朗坤 2021-05-05 14:05:29
我有一組價格和金額-其中amt1為price1的總體積。對我來說,價格太精確了,我想根據價格將價格/金額對分組/合并/匯總到均勻分布的存儲桶中,然后對金額進行求和。例如,我原來的df:index    price1 price2 price3 price4 amt1 amt2 amt3 amt41          451    454    462    470   10    1   2   52          448    452    458    464   8     2   6   23          461    463    468    480   1     3   6   94          453    455    471    481   4     3   2   4將產生:index bin1 bin2 bin3 bin4 bin5 amt1 amt2 amt3 amt4 amt51     440  450  460  470  480   0    11   2    5    02     440  450  460  470  480   8     8   2    0    03     440  450  460  470  480   0     0  10    0    94     440  450  460  470  480   0     7   0    2    4幾件事要注意:我選擇將10裝箱。bin1表示440-449。價格始終按升序排列。我實際上有500個價格/體積對要計算(1000列df),因此需要擴展。速度實際上是優先考慮的事情(盡管乞g不能成為選擇者)。感謝任何幫助。
查看完整描述

1 回答

?
慕尼黑5688855

TA貢獻1848條經驗 獲得超2個贊

首先創建帶有組的扁平化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  g

0   451   10  0

1   454    1  0

2   462    2  0

3   470    5  0

4   448    8  1

5   452    2  1

6   458    6  1

7   464    2  1

8   461    1  2

9   463    3  2

10  468    6  2

11  480    9  2

12  453    4  3

13  455    3  3

14  471    2  3

15  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  480

g                           

0      0   11    2    5    0

1      8    8    2    0    0

2      0    0   10    0    9

3      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  amt5

g                                                            

0   440   450   460   470   480     0    11     2     5     0

1   440   450   460   470   480     8     8     2     0     0

2   440   450   460   470   480     0     0    10     0     9

3   440   450   460   470   480     0     7     0     2     4


查看完整回答
反對 回復 2021-05-25
  • 1 回答
  • 0 關注
  • 150 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號