簡體   English   中英

對python pandas數據框進行分箱:提取分箱中心和另一列的總和

[英]Binning a python pandas dataframe: extracting bin centers and the sum of another column

我在對熊貓數據框進行分類然后提取必要的繪圖變量時遇到了一些麻煩。

我有一個如下所示的熊貓數據框:

            a    ad    td  price  result  profit_loss  
12935   10809 -1181  2363    262     1.0     616743.0  
13025  -18771   696  1390    350     1.0       1390.0  
13079  -20154   348   695    305     0.0        695.0  
13085    2370  3945  3150    264     0.0    -828450.0 

我想將數據幀的行裝箱到“ td”字段的大小相等的箱中(例如td = 0-100、100-200、200-300),並計算落入該td箱中的所有Profit_loss條目的總和

例如,在這里,對於0-2000的td bin,profit_loss為1390 + 695。

然后,我想繪制td bin中心與Profit_loss總和的關系圖。

我努力了:

bins = np.linspace(df.td.min(), df.td.max(), 10)
groups = df.groupby(pd.cut(df.td, bins))

但是我不確定如何提取td bin中心和所創建的profit_loss和並繪制它們。

謝謝!

bin列添加到數據框,然后分組

一個bin應該是td - td%binsize+ binsize/2如果你想居中)。

然后在bin上進行 分組 ,就可以繪制

>>> df['bin'] = df.td - df.td % 2000 + 1000
>>> s = df[['bin', 'profit_loss']].groupby('bin').sum()
>>> s
      profit_loss
bin              
1000       2085.0
3000    -211707.0
>>> s.plot(kind='bar')
<matplotlib.axes._subplots.AxesSubplot object at 0x7fce4fba3358>
>>> plt.show()

在此處輸入圖片說明

如果要在X軸上顯示所有空箱-您可以通過以下方式進行操作:

import matplotlib.pyplot as plt
import matplotlib
matplotlib.style.use('ggplot')

new = pd.DataFrame({'td':range(0, int(round(df.td.max() / 100) * 100) + 100, 100)})

(pd.merge(new, df.groupby(df.td//100*100)['profit_loss']
                 .sum().reset_index(),
          how='left')
   .fillna(0)
   .set_index('td')
   .plot.bar()
)
plt.axhline(0, color='k')

在此處輸入圖片說明

說明:

包含所有垃圾箱的幫助DF

In [68]: new
Out[68]:
      td
0      0
1    100
2    200
3    300
4    400
5    500
6    600
7    700
8    800
9    900
10  1000
11  1100
12  1200
13  1300
14  1400
15  1500
16  1600
17  1700
18  1800
19  1900
20  2000
21  2100
22  2200
23  2300
24  2400
25  2500
26  2600
27  2700
28  2800
29  2900
30  3000
31  3100
32  3200

分組原始DF

In [71]: df.groupby(df.td//100*100)['profit_loss'].sum().reset_index()
Out[71]:
     td  profit_loss
0   600        695.0
1  1300       1390.0
2  2300     616743.0
3  3100    -828450.0

合並/生成的DF

In [69]: (pd.merge(new, df.groupby(df.td//100*100)['profit_loss']
   ....:                  .sum().reset_index(),
   ....:           how='left')
   ....:    .fillna(0)
   ....: )
Out[69]:
      td  profit_loss
0      0          0.0
1    100          0.0
2    200          0.0
3    300          0.0
4    400          0.0
5    500          0.0
6    600        695.0
7    700          0.0
8    800          0.0
9    900          0.0
10  1000          0.0
11  1100          0.0
12  1200          0.0
13  1300       1390.0
14  1400          0.0
15  1500          0.0
16  1600          0.0
17  1700          0.0
18  1800          0.0
19  1900          0.0
20  2000          0.0
21  2100          0.0
22  2200          0.0
23  2300     616743.0
24  2400          0.0
25  2500          0.0
26  2600          0.0
27  2700          0.0
28  2800          0.0
29  2900          0.0
30  3000          0.0
31  3100    -828450.0
32  3200          0.0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM