[英]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應該是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.