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。介入解释