Python 对数据帧进行装箱:提取装箱中心和另一列的总和

Python 对数据帧进行装箱:提取装箱中心和另一列的总和,python,pandas,group-by,binning,Python,Pandas,Group By,Binning,我在合并熊猫数据框,然后提取必要的绘图变量时遇到了一些麻烦 我有一个熊猫数据框,如下所示: 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

我在合并熊猫数据框,然后提取必要的绘图变量时遇到了一些麻烦

我有一个熊猫数据框,如下所示:

            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容器中的所有损益条目的总和

e、 g.这里,对于0-2000年的td bin,损益为1390+695

然后,我想绘制td bin中心与损益总额的对比图

我试过:

bins = np.linspace(df.td.min(), df.td.max(), 10)
groups = df.groupby(pd.cut(df.td, bins))
但我不知道如何提取td bin中心和创建的损益总额,并绘制它们

谢谢

将bin列添加到数据帧,然后添加groupby 垃圾箱应为
td-td%binsize
+binsize/2
,如果需要中心)

然后在垃圾桶上分组,你就可以绘图了

>>> 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()
df['bin']=df.td-df.td%2000+1000 >>>s=df[['bin','损益']]。分组依据('bin')。总和() >>> 盈亏 箱子 1000 2085.0 3000 -211707.0 >>>s.plot(kind='bar') >>>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

您是否也要绘制空垃圾箱?是的,请@MaxU!我添加了一个答案-这就是你想要的吗?@MaxU-是的!谢谢我只是想确切地了解所有的100人到底在做什么-请看你回答的评论谢谢!小的后续问题。。。。现在抓取bin中心进行绘图的语法是什么?@SamGregson add only
。plot(kind='bar')
看起来效果不错,谢谢,@maxu!现在检查/理解它到底在做什么…@SamGregson,我添加了一些解释步骤。请考虑/举出最有帮助的答案-这也将表明你的问题已经得到回答…谢谢!我一定会的。我非常感谢你的帮助!如果我想要“s”大小的垃圾箱呢。我最初的想法是所有的100->s。此外,groupby中的楼层划分也让我有点困惑。抱歉打扰了,我只是想彻底理解这一点,这样我就不必打扰任何人了@SamGregson,你说‘我想要s大小的垃圾箱’是什么意思?如果s`在您的问题中是
100
,只需将
100
替换为
s
即可。。。关于整数除法-您可以使用它,无需打印即可查看结果集-请参见2。介入解释