Pandas统计分析基础(4):DataFrame的数据分析及画图功能(case:京津冀地区的gdp和人口的关系)

✅作者简介:大家好我是Xlong,一枚正在学习COMSOL、Python的工科研究僧
📃个人主页:  Xlong的个人博客主页
🔥系列专栏:   Python大数据分析
💖如果觉得博主的文章还不错的话,请👍支持一下博主哦🤞

        在上篇文章中主要介绍了DataFrame中元素的增、删、改、查等基本功能,本篇文章主要是DataFrame的数据分析及画图功能的介绍。

目录

一、DataFrame的数据分析功能

1.1.读取output.xlsx文件中的sheet1 (gdp数据)

1.2 求每个地区的gdp平均值

1.3 每年全国总体gdp

1.4 快速查看每列数据的统计信息

 二、 利用DataFrame画图

2.1 折线图 

2.2 柱状图


一、DataFrame的数据分析功能

用上篇文章中导出的数据文件(output.xlsx)进行演示

1.1.读取output.xlsx文件中的sheet1 (gdp数据)

import pandas as pd
excelFile = r'output.xlsx'
df = pd.DataFrame(pd.read_excel(excelFile,sheet_name=0,index_col=0))#index_col=0,,可以去掉没意义的第一列标号和unnamed:0
print(df)

运行结果:

  北京市       天津市       河北省  ...      青海省  宁夏回族自治区  新疆维吾尔自治区
2018年  30319.98  18809.64  36010.27  ...  2865.23  3705.18  12199.08
2017年  28014.94  18549.19  34016.32  ...  2624.83  3443.56  10881.96
2016年  25669.13  17885.39  32070.45  ...  2572.49  3168.59   9649.70
2015年  23014.59  16538.19  29806.11  ...  2417.05  2911.77   9324.80
2014年  21330.83  15726.93  29421.15  ...  2303.32  2752.10   9273.46
2013年  19800.81  14442.01  28442.95  ...  2122.06  2577.57   8443.84
2012年  17879.40  12893.88  26575.01  ...  1893.54  2341.29   7505.31
2011年  16251.93  11307.28  24515.76  ...  1670.44  2102.21   6610.05
2010年  14113.58   9224.46  20394.26  ...  1350.43  1689.65   5437.47
2009年  12153.03   7521.85  17235.48  ...  1081.27  1353.31   4277.05
2008年  11115.00   6719.01  16011.97  ...  1018.62  1203.92   4183.21
2007年   9846.81   5252.76  13607.32  ...   797.35   919.11   3523.16
2006年   8117.78   4462.74  11467.60  ...   648.50   725.90   3045.26
2005年   6969.52   3905.64  10012.11  ...   543.32   612.61   2604.19
2004年   6033.21   3110.97   8477.63  ...   466.10   537.11   2209.09
2003年   5007.21   2578.03   6921.29  ...   390.20   445.36   1886.35
2002年   4315.00   2150.76   6018.28  ...   340.65   377.16   1612.65
2001年   3707.96   1919.09   5516.76  ...   300.13   337.44   1491.60
2000年   3161.66   1701.88   5043.96  ...   263.68   295.02   1363.56

[19 rows x 31 columns]

1.2 求每个地区的gdp平均值

import pandas as pd
excelFile = r'output.xlsx'
df = pd.DataFrame(pd.read_excel(excelFile,sheet_name=0,index_col=0))#index_col=0,,可以去掉没意义的第一列标号和unnamed:0
print(df.mean(numeric_only=None))#是针对每一列去操作

运行结果:

北京市         14043.282632
天津市          9194.721053
河北省         19029.720000
山西省          8346.071579
内蒙古自治区      10004.022105
辽宁省         16118.040000
吉林省          8209.141579
黑龙江省         9662.531579
上海市         16340.200000
江苏省         41224.622632
浙江省         26604.160526
安徽省         12867.220526
福建省         15273.601579
江西省          9665.197895
山东省         37637.603158
河南省         22333.658421
湖北省         16681.162632
湖南省         16340.998947
广东省         45022.102632
广西壮族自治区      9521.931053
海南省          2149.985789
重庆市          8715.997895
四川省         17668.912632
贵州省          5597.343684
云南省          7890.748947
西藏自治区         582.042105
陕西省         10341.775789
甘肃省          4085.462105
青海省          1351.011053
宁夏回族自治区      1657.834737
新疆维吾尔自治区     5553.778421
dtype: float64

1.3 每年全国总体gdp

import pandas as pd
excelFile = r'output.xlsx'
df = pd.DataFrame(pd.read_excel(excelFile,sheet_name=0,index_col=0))#index_col=0,,可以去掉没意义的第一列标号和unnamed:0
print(df.sum(axis=1) ) #通过修改axis参数,可以使之对每一行作用

运行结果:

2018年    914707.46
2017年    847140.10
2016年    780069.97
2015年    722767.87
2014年    684349.42
2013年    634345.33
2012年    576551.84
2011年    521441.11
2010年    437041.99
2009年    365303.69
2008年    333313.95
2007年    279737.86
2006年    232836.74
2005年    199228.10
2004年    167922.56
2003年    139537.19
2002年    120819.30
2001年    108775.71
2000年     98692.60
dtype: float64

1.4 快速查看每列数据的统计信息

import pandas as pd
excelFile = r'output.xlsx'
df = pd.DataFrame(pd.read_excel(excelFile,sheet_name=0,index_col=0))#index_col=0,,可以去掉没意义的第一列标号和unnamed:0
print(df.describe())

运行结果:

                 北京市           天津市  ...      宁夏回族自治区      新疆维吾尔自治区
count     19.000000     19.000000  ...    19.000000     19.000000
mean   14043.282632   9194.721053  ...  1657.834737   5553.778421
std     8699.383871   6289.667859  ...  1171.810868   3555.326670
min     3161.660000   1701.880000  ...   295.020000   1363.560000
25%     6501.365000   3508.305000  ...   574.860000   2406.640000
50%    12153.030000   7521.850000  ...  1353.310000   4277.050000
75%    20565.820000  15084.470000  ...  2664.835000   8858.650000
max    30319.980000  18809.640000  ...  3705.180000  12199.080000

[8 rows x 31 columns]

import pandas as pd
excelFile = r'output.xlsx'
df = pd.DataFrame(pd.read_excel(excelFile,sheet_name=0,index_col=0))#index_col=0,,可以去掉没意义的第一列标号和unnamed:0
print(df.T.describe()) #注意,describe()功能不支持换轴

运行结果:

                2018年         2017年  ...         2001年         2000年
count     31.000000     31.000000  ...     31.000000     31.000000
mean   29506.692258  27327.100000  ...   3508.893871   3183.632258
std    23905.147349  22186.906272  ...   2839.736508   2556.305244
min     1477.630000   1310.920000  ...    139.160000    117.800000
25%    15718.120000  15236.475000  ...   1816.450000   1620.500000
50%    21984.780000  20006.310000  ...   2279.340000   2080.040000
75%    36218.025000  33959.640000  ...   4663.285000   4298.630000
max    97277.770000  89705.230000  ...  12039.250000  10741.250000

[8 rows x 19 columns]

 二、 利用DataFrame画图

        由于DataFrame天然是用来处理多组同类数据的,因此在绘制多组数据对比的柱状图、折线图、散点图等时均比用ndarray作为输入数据画图更为高效。

        Case:京津冀地区的gdp和人口的关系

import pandas as pd
excelFile = r'output.xlsx'
df = pd.DataFrame(pd.read_excel(excelFile,sheet_name=0,index_col=0))#index_col=0,,可以去掉没意义的第一列标号和unnamed:0
JJJgdp = df[['北京市','天津市','河北省']]
print(JJJgdp,'\n') #注意,describe()功能不支持换轴
dp = pd.DataFrame(pd.read_excel(excelFile,sheet_name=1,index_col=0))#index_col=0,,可以去掉没意义的第一列标号和unnamed:0
JJJpop = dp[['北京市','天津市','河北省']]
print(JJJpop)

运行结果:

             北京市       天津市       河北省
2018年  30319.98  18809.64  36010.27
2017年  28014.94  18549.19  34016.32
2016年  25669.13  17885.39  32070.45
2015年  23014.59  16538.19  29806.11
2014年  21330.83  15726.93  29421.15
2013年  19800.81  14442.01  28442.95
2012年  17879.40  12893.88  26575.01
2011年  16251.93  11307.28  24515.76
2010年  14113.58   9224.46  20394.26
2009年  12153.03   7521.85  17235.48
2008年  11115.00   6719.01  16011.97
2007年   9846.81   5252.76  13607.32
2006年   8117.78   4462.74  11467.60
2005年   6969.52   3905.64  10012.11
2004年   6033.21   3110.97   8477.63
2003年   5007.21   2578.03   6921.29
2002年   4315.00   2150.76   6018.28
2001年   3707.96   1919.09   5516.76
2000年   3161.66   1701.88   5043.96


        北京市   天津市   河北省
2018年  2154  1560  7556
2017年  2171  1557  7520
2016年  2173  1562  7470
2015年  2171  1547  7425
2014年  2152  1517  7384
2013年  2115  1472  7333
2012年  2069  1413  7288
2011年  2019  1355  7241
2010年  1962  1299  7194
2009年  1860  1228  7034
2008年  1771  1176  6989
2007年  1676  1115  6943
2006年  1601  1075  6898
2005年  1538  1043  6851
2004年  1493  1024  6809
2003年  1456  1011  6769
2002年  1423  1007  6735
2001年  1385  1004  6699
2000年  1364  1001  6674

2.1 折线图 

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
excelFile = r'output.xlsx'
df = pd.DataFrame(pd.read_excel(excelFile,sheet_name=0,index_col=0))#index_col=0,,可以去掉没意义的第一列标号和unnamed:0
JJJgdp = df[['北京市','天津市','河北省']]
dp = pd.DataFrame(pd.read_excel(excelFile,sheet_name=1,index_col=0))#index_col=0,,可以去掉没意义的第一列标号和unnamed:0
JJJpop = dp[['北京市','天津市','河北省']]
fig_JJJ,ax_JJJ=plt.subplots()
#ax_jjj.cla()
JJJgdp.plot(ax=ax_JJJ,style='--o')
#df.plot()画图时,可以将已有的子图赋值给其ax属性,这样画图就会画到已有的子图里,便于后续修改
plt.rcParams['font.sans-serif']=['SimHei']  #图中字体改为黑体以兼容中文
plt.rcParams['axes.unicode_minus']=False #负号显示的问题
plt.show()

运行结果:

DataFrame在画图时,默认是以每一列为一个分类,index为横轴,数值为纵轴

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
excelFile = r'output.xlsx'
df = pd.DataFrame(pd.read_excel(excelFile,sheet_name=0,index_col=0))#index_col=0,,可以去掉没意义的第一列标号和unnamed:0
JJJgdp = df[['北京市','天津市','河北省']]
dp = pd.DataFrame(pd.read_excel(excelFile,sheet_name=1,index_col=0))#index_col=0,,可以去掉没意义的第一列标号和unnamed:0
JJJpop = dp[['北京市','天津市','河北省']]
fig_JJJ,ax_JJJ=plt.subplots()
#ax_JJJ.cla()
JJJgdp.plot(ax=ax_JJJ,style='--o')
#df.plot()画图时,可以将已有的子图赋值给其ax属性,这样画图就会画到已有的子图里,便于后续修改
plt.rcParams['font.sans-serif']=['SimHei']  #图中字体改为黑体以兼容中文
plt.rcParams['axes.unicode_minus']=False #负号显示的问题
ax_JJJ.set_xlabel('年份')
ax_JJJ.set_ylabel('GDP')
ax_JJJ.set_xticks(np.arange(0,20,1))
plt.show()
fig_JJJ.savefig('line.jpg', bbox_inches = 'tight')#保存图片

运行结果:

2.2 柱状图

绘制分类的柱状图,可以避免像之前那样设置柱的宽度了

import pandas as pd
import matplotlib.pyplot as plt
excelFile = r'output.xlsx'
df = pd.DataFrame(pd.read_excel(excelFile,sheet_name=0,index_col=0))#index_col=0,,可以去掉没意义的第一列标号和unnamed:0
JJJgdp = df[['北京市','天津市','河北省']]
dp = pd.DataFrame(pd.read_excel(excelFile,sheet_name=1,index_col=0))#index_col=0,,可以去掉没意义的第一列标号和unnamed:0
JJJpop = dp[['北京市','天津市','河北省']]
fig_bar1,ax_bar1=plt.subplots()
JJJgdp.plot.bar(ax=ax_bar1)
plt.rcParams['font.sans-serif']=['SimHei']  #图中字体改为黑体以兼容中文
plt.rcParams['axes.unicode_minus']=False #负号显示的问题
plt.show()

运行结果:

 

fig_bar1.savefig('bar1.jpg', bbox_inches = 'tight')#保存上图,名为‘bar1.jpg’.
import pandas as pd
import matplotlib.pyplot as plt
excelFile = r'output.xlsx'
df = pd.DataFrame(pd.read_excel(excelFile,sheet_name=0,index_col=0))#index_col=0,,可以去掉没意义的第一列标号和unnamed:0
JJJgdp = df[['北京市','天津市','河北省']]
dp = pd.DataFrame(pd.read_excel(excelFile,sheet_name=1,index_col=0))#index_col=0,,可以去掉没意义的第一列标号和unnamed:0
JJJpop = dp[['北京市','天津市','河北省']]
plt.rcParams['font.sans-serif']=['SimHei']  #图中字体改为黑体以兼容中文
plt.rcParams['axes.unicode_minus']=False #负号显示的问题
fig_bar2,ax_bar2=plt.subplots()
JJJgdp.plot.barh(ax=ax_bar2)  #barh的h即把方向调到horizon,横向
plt.show()

运行结果:

fig_bar2.savefig('bar2.jpg', bbox_inches = 'tight')#保存图片

 还可以把每一类都各自画到一个独立的子图里,省的挤在一起。例如:画出三个省分开的图

import pandas as pd
import matplotlib.pyplot as plt
excelFile = r'output.xlsx'
df = pd.DataFrame(pd.read_excel(excelFile,sheet_name=0,index_col=0))#index_col=0,,可以去掉没意义的第一列标号和unnamed:0
JJJgdp = df[['北京市','天津市','河北省']]
dp = pd.DataFrame(pd.read_excel(excelFile,sheet_name=1,index_col=0))#index_col=0,,可以去掉没意义的第一列标号和unnamed:0
JJJpop = dp[['北京市','天津市','河北省']]
plt.rcParams['font.sans-serif']=['SimHei']  #图中字体改为黑体以兼容中文
plt.rcParams['axes.unicode_minus']=False #负号显示的问题
fig_bar3,ax_bar3=plt.subplots(3,1)
#JJJgdp.plot.bar(ax=ax_bar3,subplots=True)  #subplots=True可以把每一列作为一个子图分开画
#JJJgdp.plot.bar(ax=ax_bar3,subplots=True,sharex=True)  #sharex=True 可以让这3个纵向排列的图共用一个横轴
JJJgdp.plot.bar(ax=ax_bar3,subplots=True,sharex=True,title=['','','']) #title可以给三个子图加标题,加空标题即可起到去掉标题的作用
ax_bar3[1].set_ylabel('GDP (亿元)')  #每个子图都可以做进一步修改
plt.show()

 运行结果:

fig_bar3.savefig('bar3.jpg', bbox_inches = 'tight')#保存图片

         以上就是《Pandas统计分析基础(4):DataFrame的数据分析及画图功能》,如果有改进的建议,欢迎在评论区留言交流~

        持续更新中......原创不易,各位看官请随手点下Follow和Star,感谢!!!

  • 10
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xlong~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值