panda强化练习2
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
#读取excel数据并转化为csv格式
data_xls=pd.read_excel('地市级党委书记数据库(2000-10).xls','中国人民共和国地市级党委书记数据库(2000-10)',index_col = 0)
data_xls.to_csv('test_csv.csv', encoding='utf-8')
#读取csv格式的文件
data=pd.read_csv('test_csv.csv')
data.head(5)
省级政区代码 | 省级政区名称 | 地市级政区代码 | 地市级政区名称 | 年份 | 党委书记姓名 | 出生年份 | 出生月份 | 籍贯省份代码 | 籍贯省份名称 | ... | 民族 | 教育 | 是否是党校教育(是=1,否=0) | 专业:人文 | 专业:社科 | 专业:理工 | 专业:农科 | 专业:医科 | 入党年份 | 工作年份 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 130000 | 河北省 | 130100 | 石家庄市 | 2000 | 陈来立 | NaN | NaN | NaN | NaN | ... | NaN | 硕士 | 1.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
1 | 130000 | 河北省 | 130100 | 石家庄市 | 2001 | 吴振华 | NaN | NaN | NaN | NaN | ... | NaN | 本科 | 0.0 | 0.0 | 0.0 | 1.0 | 0.0 | 0.0 | NaN | NaN |
2 | 130000 | 河北省 | 130100 | 石家庄市 | 2002 | 吴振华 | NaN | NaN | NaN | NaN | ... | NaN | 本科 | 0.0 | 0.0 | 0.0 | 1.0 | 0.0 | 0.0 | NaN | NaN |
3 | 130000 | 河北省 | 130100 | 石家庄市 | 2003 | 吴振华 | NaN | NaN | NaN | NaN | ... | NaN | 本科 | 0.0 | 0.0 | 0.0 | 1.0 | 0.0 | 0.0 | NaN | NaN |
4 | 130000 | 河北省 | 130100 | 石家庄市 | 2004 | 吴振华 | NaN | NaN | NaN | NaN | ... | NaN | 本科 | 0.0 | 0.0 | 0.0 | 1.0 | 0.0 | 0.0 | NaN | NaN |
5 rows × 23 columns
#把列名转化长一个列表
filed=data.columns.tolist()
print(filed)
print(data.columns)
['省级政区代码', '省级政区名称', '地市级政区代码', '地市级政区名称', '年份', '党委书记姓名', '出生年份', '出生月份', '籍贯省份代码', '籍贯省份名称', '籍贯地市代码', '籍贯地市名称', '性别', '民族', '教育', '是否是党校教育(是=1,否=0)', '专业:人文', '专业:社科', '专业:理工', '专业:农科', '专业:医科', '入党年份', '工作年份']
Index(['省级政区代码', '省级政区名称', '地市级政区代码', '地市级政区名称', '年份', '党委书记姓名', '出生年份',
'出生月份', '籍贯省份代码', '籍贯省份名称', '籍贯地市代码', '籍贯地市名称', '性别', '民族', '教育',
'是否是党校教育(是=1,否=0)', '专业:人文', '专业:社科', '专业:理工', '专业:农科', '专业:医科', '入党年份',
'工作年份'],
dtype='object')
print(data.describe(include=[np.number]))
print('----------')
# .describe()返回基本数据信息
# .describe(include=[np.number])只统计数值类型
# ()中没有任何参数时,会默认只统计数值类型的字段内容,包括:计数,平均数,方差,最小值,最大值,四分位数,若其中有字符串数据会报错
print(data.describe(include=[np.object]))
# 这里代表只统计字符串类型的字段内容:计数,唯一值数量,出现频率最高的内容,最高出现频率
省级政区代码 地市级政区代码 年份 出生年份 出生月份 \
count 3663.000000 3663.000000 3663.000000 2676.000000 2645.000000
mean 403393.393393 404456.756757 2005.000000 1953.622571 6.790548
std 148176.721620 148485.810327 3.162709 4.416316 3.614664
min 130000.000000 130100.000000 2000.000000 1941.000000 1.000000
25% 330000.000000 330100.000000 2002.000000 1951.000000 3.000000
50% 420000.000000 420200.000000 2005.000000 1954.000000 7.000000
75% 510000.000000 513400.000000 2008.000000 1956.000000 10.000000
max 650000.000000 654300.000000 2010.000000 1966.000000 14.000000 籍贯省份代码 籍贯地市代码 是否是党校教育(是=1,否=0) 专业:人文 \
count 2624.000000 2615.000000 2493.000000 2370.000000
mean 364428.353659 365742.332696 0.430405 0.275527
std 126267.485520 125961.993399 0.576136 0.446874
min 110000.000000 120000.000000 0.000000 0.000000
25% 320000.000000 320700.000000 0.000000 0.000000
50% 370000.000000 370700.000000 0.000000 0.000000
75% 430000.000000 431300.000000 1.000000 1.000000
max 640000.000000 640500.000000 9.000000 1.000000 专业:社科 专业:理工 专业:农科 专业:医科 入党年份 \
count 2376.000000 2371.000000 2369.000000 2370.000000 2384.000000
mean 0.627525 0.256854 0.067539 0.009705 1976.906879
std 0.483566 0.436990 0.251006 0.098054 5.310080
min 0.000000 0.000000 0.000000 0.000000 1961.000000
25% 0.000000 0.000000 0.000000 0.000000 1973.000000
50% 1.000000 0.000000 0.000000 0.000000 1976.000000
75% 1.000000 1.000000 0.000000 0.000000 1981.000000
max 1.000000 1.000000 1.000000 1.000000 1994.000000 工作年份
count 2568.000000
mean 1973.129673
std 4.856564
min 1958.000000
25% 1970.000000
50% 1972.500000
75% 1976.000000
max 1990.000000
----------
省级政区名称 地市级政区名称 党委书记姓名 籍贯省份名称 籍贯地市名称 性别 民族 教育
count 3663 3663 3021 2624 2615 2708 2517 2550
unique 27 333 901 29 240 2 2 7
top 广东省 白山市 焉荣竹 山东省 威海市 男 汉族 硕士
freq 231 11 11 313 58 2633 2351 1381
#取出性别这一列
data_gender=data['性别']
data_gender.head()
0 NaN
1 NaN
2 NaN
3 NaN
4 NaN
Name: 性别, dtype: object
#过来吃掉空值
data_gender_re=data_gender[data_gender.notnull()]
data_gender_re.head()
121 男
122 男
123 男
124 男
125 男
Name: 性别, dtype: object
#查看性别这一列都有那些数值
data_gender_re.unique()
array(['男', '女'], dtype=object)
#统计总数
count_total=data_gender_re.count()
count_total
2708
#分别统计男女占比
count_m=data_gender_re[data_gender_re=='男'].count()
count_m
2633
#统计女的数量
count_f=data_gender_re[data_gender_re=='女'].count()
count_f
75
#分别查看男女数量
data_gender_re.value_counts()
男 2633
女 75
Name: 性别, dtype: int64
#查看男占比
count_m/count_total
0.9723042836041359
#查看女占比
count_f/count_total
0.027695716395864108
按省份分析市委书记的女性比例
#取出省份和性别这两列,过滤掉性别为空的
data_gender2 = data[['省级政区名称','性别']]
data_gender2_re = data_gender2[data_gender2['性别'].notnull()]
data_gender2_re.head()
省级政区名称 | 性别 | |
---|---|---|
121 | 山西省 | 男 |
122 | 山西省 | 男 |
123 | 山西省 | 男 |
124 | 山西省 | 男 |
125 | 山西省 | 男 |
#按省份分组,统计性别的频数
pt=pd.crosstab(data_gender2_re['省级政区名称'],data_gender2_re['性别'])
pt.head()
性别 | 女 | 男 |
---|---|---|
省级政区名称 | ||
云南省 | 2 | 73 |
内蒙古自治区 | 0 | 86 |
吉林省 | 4 | 72 |
四川省 | 8 | 155 |
宁夏回族自治区 | 0 | 49 |
#给pt1新增一列女性占比,按男性占比后赋值给pt2
pt['女性占比']=pt['女']/(pt['男']+pt['女'])
pt2=pt.sort_values(by=['女性占比'],ascending=False)
pt2.head()
性别 | 女 | 男 | 女性占比 |
---|---|---|---|
省级政区名称 | |||
辽宁省 | 13 | 121 | 0.097015 |
陕西省 | 9 | 93 | 0.088235 |
吉林省 | 4 | 72 | 0.052632 |
山西省 | 6 | 112 | 0.050847 |
四川省 | 8 | 155 | 0.049080 |
#根据上面结构绘图
#创建一张8*4的图标
fig_q1_1=plt.figure(figsize=(8,4))
#把省份作为横轴,取钱10个
index=pt2.index[:10]
plt.bar(range(10), # 横坐标
pt2['女性占比'][:10], # 纵坐标
tick_label=index, # 横轴标签
color = 'red' ) # 颜色
plt.title('不同省份女性市委书记占比')
plt.xlabel('省份')
plt.ylabel('女性占比')
plt.show()
##图标2:女性视为书籍的占比结构
fig_q1_2=plt.figure(figsize=(4,4))
plt.boxplot(pt2['女性占比'],#值
vert=True,#纵向
showmeans=True)#显示均值
plt.title('女性市委书记占比')
plt.xticks([])
plt.ylabel('女性占比')
plt.show()
年龄情况 ,专业情况
#年龄情况,整体年龄情况/入职年龄情况/退休年龄情况
data_age=data[['出生年份','党委书记姓名','年份']]
data_age.head()
出生年份 | 党委书记姓名 | 年份 | |
---|---|---|---|
0 | NaN | 陈来立 | 2000 |
1 | NaN | 吴振华 | 2001 |
2 | NaN | 吴振华 | 2002 |
3 | NaN | 吴振华 | 2003 |
4 | NaN | 吴振华 | 2004 |
#过滤掉出生年份为空的
data_age_re=data_age[data_age['出生年份'].notnull()]
data_age_re.head()
出生年份 | 党委书记姓名 | 年份 | |
---|---|---|---|
121 | 1945.0 | 侯伍杰 | 2000 |
122 | 1945.0 | 侯伍杰 | 2001 |
123 | 1950.0 | 云公民 | 2002 |
124 | 1950.0 | 云公民 | 2003 |
125 | 1950.0 | 云公民 | 2004 |
#查看出生年份的组成值
data_age_re['出生年份'].unique()
array([1945., 1950., 1956., 1949., 1952., 1957., 1953., 1960., 1955.,
1951., 1954., 1948., 1947., 1946., 1944., 1962., 1964., 1942.,
1963., 1958., 1965., 1943., 1961., 1959., 1941., 1966.])
#查看出生年份的描述
data_age_re.describe()
出生年份 | 年份 | |
---|---|---|
count | 2676.000000 | 2676.000000 |
mean | 1953.622571 | 2005.214499 |
std | 4.416316 | 3.046486 |
min | 1941.000000 | 2000.000000 |
25% | 1951.000000 | 2003.000000 |
50% | 1954.000000 | 2005.000000 |
75% | 1956.000000 | 2008.000000 |
max | 1966.000000 | 2010.000000 |
#计算出整体年龄数据
df1=2017-data_age_re['出生年份']
df1.head()
121 72.0
122 72.0
123 67.0
124 67.0
125 67.0
Name: 出生年份, dtype: float64
df1.describe()
count 2676.000000
mean 63.377429
std 4.416316
min 51.000000
25% 61.000000
50% 63.000000
75% 66.000000
max 76.000000
Name: 出生年份, dtype: float64
#计算入职年龄(先计算每个人入职年龄的最小值),再看每个年份的入职人数
df_yearmin = data_age_re[['党委书记姓名','年份']].groupby(data_age_re['党委书记姓名']).min()
df2=df_yearmin['年份'].groupby(df_yearmin['年份']).count()
df2
年份
2000 190
2001 69
2002 65
2003 88
2004 51
2005 55
2006 50
2007 59
2008 99
2009 23
Name: 年份, dtype: int64
#查看卸任年龄
df_yearmax = data_age_re[['党委书记姓名','年份']].groupby(data_age_re['党委书记姓名']).max()
df3=df_yearmax.groupby(df_yearmax['年份']).count()
df3
党委书记姓名 | |
---|---|
年份 | |
2000 | 47 |
2001 | 44 |
2002 | 71 |
2003 | 38 |
2004 | 48 |
2005 | 49 |
2006 | 58 |
2007 | 105 |
2008 | 25 |
2009 | 41 |
2010 | 223 |
##专业情况 专业结构 / 专业整体情况 / 专业大类分布
data_major=data[['党委书记姓名','专业:人文','专业:社科','专业:理工','专业:农科','专业:医科']]
data_major_re=data[data_major['专业:人文'].notnull()]
data_major_re.head()
省级政区代码 | 省级政区名称 | 地市级政区代码 | 地市级政区名称 | 年份 | 党委书记姓名 | 出生年份 | 出生月份 | 籍贯省份代码 | 籍贯省份名称 | ... | 民族 | 教育 | 是否是党校教育(是=1,否=0) | 专业:人文 | 专业:社科 | 专业:理工 | 专业:农科 | 专业:医科 | 入党年份 | 工作年份 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 130000 | 河北省 | 130100 | 石家庄市 | 2001 | 吴振华 | NaN | NaN | NaN | NaN | ... | NaN | 本科 | 0.0 | 0.0 | 0.0 | 1.0 | 0.0 | 0.0 | NaN | NaN |
2 | 130000 | 河北省 | 130100 | 石家庄市 | 2002 | 吴振华 | NaN | NaN | NaN | NaN | ... | NaN | 本科 | 0.0 | 0.0 | 0.0 | 1.0 | 0.0 | 0.0 | NaN | NaN |
3 | 130000 | 河北省 | 130100 | 石家庄市 | 2003 | 吴振华 | NaN | NaN | NaN | NaN | ... | NaN | 本科 | 0.0 | 0.0 | 0.0 | 1.0 | 0.0 | 0.0 | NaN | NaN |
4 | 130000 | 河北省 | 130100 | 石家庄市 | 2004 | 吴振华 | NaN | NaN | NaN | NaN | ... | NaN | 本科 | 0.0 | 0.0 | 0.0 | 1.0 | 0.0 | 0.0 | NaN | NaN |
5 | 130000 | 河北省 | 130100 | 石家庄市 | 2005 | 吴振华 | NaN | NaN | NaN | NaN | ... | NaN | 本科 | 0.0 | 0.0 | 0.0 | 1.0 | 0.0 | 0.0 | NaN | NaN |
5 rows × 23 columns
data_major_re.mean()
省级政区代码 388046.413502
地市级政区代码 388781.772152
年份 2005.479747
出生年份 1954.297048
出生月份 6.704082
籍贯省份代码 369873.772791
籍贯地市代码 371312.159624
是否是党校教育(是=1,否=0) 0.406809
专业:人文 0.275527
专业:社科 0.626582
专业:理工 0.256540
专业:农科 0.067539
专业:医科 0.009705
入党年份 1977.430507
工作年份 1973.622338
dtype: float64
data_major_re.describe()
省级政区代码 | 地市级政区代码 | 年份 | 出生年份 | 出生月份 | 籍贯省份代码 | 籍贯地市代码 | 是否是党校教育(是=1,否=0) | 专业:人文 | 专业:社科 | 专业:理工 | 专业:农科 | 专业:医科 | 入党年份 | 工作年份 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
count | 2370.000000 | 2370.000000 | 2370.000000 | 2168.000000 | 2156.000000 | 2139.000000 | 2130.000000 | 2350.000000 | 2370.000000 | 2370.000000 | 2370.000000 | 2369.000000 | 2370.000000 | 1993.000000 | 2113.000000 |
mean | 388046.413502 | 388781.772152 | 2005.479747 | 1954.297048 | 6.704082 | 369873.772791 | 371312.159624 | 0.406809 | 0.275527 | 0.626582 | 0.256540 | 0.067539 | 0.009705 | 1977.430507 | 1973.622338 |
std | 137507.595852 | 137533.425865 | 3.040290 | 4.250503 | 3.618283 | 126451.656681 | 126006.184835 | 0.491343 | 0.446874 | 0.483814 | 0.436815 | 0.251006 | 0.098054 | 5.265569 | 4.857468 |
min | 130000.000000 | 130100.000000 | 2000.000000 | 1941.000000 | 1.000000 | 110000.000000 | 120000.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 1964.000000 | 1960.000000 |
25% | 320000.000000 | 321300.000000 | 2003.000000 | 1952.000000 | 3.000000 | 320000.000000 | 320900.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 1974.000000 | 1970.000000 |
50% | 410000.000000 | 410600.000000 | 2006.000000 | 1954.000000 | 7.000000 | 370000.000000 | 370900.000000 | 0.000000 | 0.000000 | 1.000000 | 0.000000 | 0.000000 | 0.000000 | 1976.000000 | 1973.000000 |
75% | 450000.000000 | 451175.000000 | 2008.000000 | 1957.000000 | 10.000000 | 440000.000000 | 440500.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 0.000000 | 0.000000 | 1982.000000 | 1976.000000 |
max | 650000.000000 | 650200.000000 | 2010.000000 | 1966.000000 | 14.000000 | 640000.000000 | 640500.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 1994.000000 | 1990.000000 |
#统计每个人的专业
data_major_re['专业']=data_major_re[['专业:人文', '专业:社科', '专业:理工', '专业:农科', '专业:医科']].idxmax(axis=1)
data_major_re.head()
C:\Anaconda3\lib\site-packages\ipykernel_launcher.py:2: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
省级政区代码 | 省级政区名称 | 地市级政区代码 | 地市级政区名称 | 年份 | 党委书记姓名 | 出生年份 | 出生月份 | 籍贯省份代码 | 籍贯省份名称 | ... | 教育 | 是否是党校教育(是=1,否=0) | 专业:人文 | 专业:社科 | 专业:理工 | 专业:农科 | 专业:医科 | 入党年份 | 工作年份 | 专业 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 130000 | 河北省 | 130100 | 石家庄市 | 2001 | 吴振华 | NaN | NaN | NaN | NaN | ... | 本科 | 0.0 | 0.0 | 0.0 | 1.0 | 0.0 | 0.0 | NaN | NaN | 专业:理工 |
2 | 130000 | 河北省 | 130100 | 石家庄市 | 2002 | 吴振华 | NaN | NaN | NaN | NaN | ... | 本科 | 0.0 | 0.0 | 0.0 | 1.0 | 0.0 | 0.0 | NaN | NaN | 专业:理工 |
3 | 130000 | 河北省 | 130100 | 石家庄市 | 2003 | 吴振华 | NaN | NaN | NaN | NaN | ... | 本科 | 0.0 | 0.0 | 0.0 | 1.0 | 0.0 | 0.0 | NaN | NaN | 专业:理工 |
4 | 130000 | 河北省 | 130100 | 石家庄市 | 2004 | 吴振华 | NaN | NaN | NaN | NaN | ... | 本科 | 0.0 | 0.0 | 0.0 | 1.0 | 0.0 | 0.0 | NaN | NaN | 专业:理工 |
5 | 130000 | 河北省 | 130100 | 石家庄市 | 2005 | 吴振华 | NaN | NaN | NaN | NaN | ... | 本科 | 0.0 | 0.0 | 0.0 | 1.0 | 0.0 | 0.0 | NaN | NaN | 专业:理工 |
5 rows × 24 columns
#去重
data_major_st=data_major_re[['党委书记姓名','专业']].drop_duplicates()
data_major_st.head()
党委书记姓名 | 专业 | |
---|---|---|
1 | 吴振华 | 专业:理工 |
7 | 吴显国 | 专业:社科 |
9 | 车俊 | 专业:社科 |
10 | 孙瑞彬 | 专业:社科 |
11 | 白润璋 | 专业:理工 |
#统计专业结构
df4=data_major_st['专业'].groupby(data_major_st['专业']).count()
df4
专业
专业:人文 187
专业:农科 21
专业:医科 5
专业:理工 127
专业:社科 346
Name: 专业, dtype: int64
#计算每年专业的整体数据情况(这是未去重的)
df5=pd.crosstab(data_major_re['年份'],data_major_re['专业'])
df5
专业 | 专业:人文 | 专业:农科 | 专业:医科 | 专业:理工 | 专业:社科 |
---|---|---|---|---|---|
年份 | |||||
2000 | 33 | 7 | 2 | 43 | 53 |
2001 | 42 | 6 | 3 | 36 | 78 |
2002 | 56 | 5 | 4 | 35 | 90 |
2003 | 67 | 7 | 2 | 25 | 106 |
2004 | 68 | 7 | 2 | 28 | 118 |
2005 | 63 | 7 | 2 | 31 | 123 |
2006 | 67 | 9 | 2 | 34 | 123 |
2007 | 69 | 8 | 2 | 34 | 128 |
2008 | 68 | 8 | 0 | 44 | 130 |
2009 | 67 | 8 | 0 | 42 | 131 |
2010 | 71 | 7 | 0 | 38 | 131 |
# 计算每年专业大类分布数据
df5['社科比例'] = df5['专业:社科'] / (df5['专业:理工'] + df5['专业:医科'] + df5['专业:社科'] + df5['专业:农科'] + df5['专业:人文'])
df5['人文比例'] = df5['专业:人文'] / (df5['专业:理工'] + df5['专业:医科'] + df5['专业:社科'] + df5['专业:农科'] + df5['专业:人文'])
df5['理工农医比例'] = (df5['专业:理工'] + df5['专业:医科'] + df5['专业:农科'])/ (df5['专业:理工'] + df5['专业:医科'] + df5['专业:社科'] + df5['专业:农科'] + df5['专业:人文'])
print(df5[['社科比例','人文比例','理工农医比例']])
专业 社科比例 人文比例 理工农医比例
年份
2000 0.384058 0.239130 0.376812
2001 0.472727 0.254545 0.272727
2002 0.473684 0.294737 0.231579
2003 0.512077 0.323671 0.164251
2004 0.529148 0.304933 0.165919
2005 0.544248 0.278761 0.176991
2006 0.523404 0.285106 0.191489
2007 0.531120 0.286307 0.182573
2008 0.520000 0.272000 0.208000
2009 0.528226 0.270161 0.201613
2010 0.530364 0.287449 0.182186
年龄情况的图标绘制
fig_q2=plt.figure(figsize=(12,8))
ax1=fig_q2.add_subplot(2,3,1)
ax2=fig_q2.add_subplot(2,3,2)
ax3=fig_q2.add_subplot(2,3,3)
ax4=fig_q2.add_subplot(2,3,4)
ax5=fig_q2.add_subplot(2,3,5)
ax6=fig_q2.add_subplot(2,3,6)
#亿创建的图标划分成2*3#的表格矩阵
ax1.hist(df1,bins=11,color='gray',alpha=0.9)
ax1.set_title('整体年龄分布')
ax1.grid(True)
ax2.plot(df2,color='r',marker='o',alpha=0.9)
ax2.set_title('入职年龄分布')
ax2.set_xticks(range(2000,2011,2))
ax2.grid(True)
ax3.plot(df3,color='g',marker='o',alpha=0.9)
ax3.set_title('卸任年龄分布')
ax3.set_xticks(range(2000,2011,2))
ax3.grid(True)
ax4.bar(range(len(df4)),df4,color='y')
ax4.set_xticklabels(['人文','农科','医科','理工','社科'])
ax4.grid(True)
ax4.set_title('专业结构')
ax5.plot(df5.index,df5[['专业:人文','专业:农科','专业:医科','专业:理工','专业:社科']])
ax5.grid(True)
ax5.set_title('专业整体情况')
ax6.bar(df5.index,df5['社科比例'],color = 'darkred',alpha=0.7)
ax6.bar(df5.index,df5['人文比例'],color = 'darkred',bottom = df5['社科比例'],alpha=0.5)
ax6.bar(df5.index,df5['理工农医比例'],color = 'darkred',bottom = df5['人文比例'] + df5['社科比例'],alpha=0.3)
ax6.grid(True)
ax6.set_title('专业大类分布:社科、人文、理工农医')
plt.show()
任期
#出生年份与任期的关系
# 新建变量data_term,赋值包括年份、姓名、出生年份字段内容
# 清除缺失值
data_term=data[['年份','党委书记姓名','出生年份']]
data_term_re=data_term[data_term['出生年份'].notnull()]
data_term_re.head()
年份 | 党委书记姓名 | 出生年份 | |
---|---|---|---|
121 | 2000 | 侯伍杰 | 1945.0 |
122 | 2001 | 侯伍杰 | 1945.0 |
123 | 2002 | 云公民 | 1950.0 |
124 | 2003 | 云公民 | 1950.0 |
125 | 2004 | 云公民 | 1950.0 |
year_max = data_term_re[['出生年份','年份']].groupby(data_term_re['党委书记姓名']).max()
year_max.rename(columns={'年份':'年份max'}, inplace = True)
year_max['姓名'] = year_max.index
# 统计每个党委书记任期年份最大值,且更改列明
# 将index提取出字段内容
year_min = data_term_re[['出生年份','年份']].groupby(data_term_re['党委书记姓名']).min()
year_min.rename(columns={'年份':'年份min'}, inplace = True)
year_min['姓名'] = year_min.index
# 统计每个党委书记任期年份最小值,且更改列明
# 将index提取出字段内容
data_term_fin = pd.merge(year_max,year_min)
print(data_term_fin.head())
print(data_term_fin.dtypes)
# 合并表格,默认重叠重复列明
# .dtypes查看字段类型 → 年份均为int
出生年份 年份max 姓名 年份min
0 1951.0 2009 丁海中 2003
1 1948.0 2003 丁耀民 2000
2 1951.0 2007 丁解民 2001
3 1964.0 2007 万庆良 2005
4 1957.0 2010 丰立祥 2008
出生年份 float64
年份max int64
姓名 object
年份min int64
dtype: object
data_term_fin['任期'] = data_term_fin['年份max'] - data_term_fin['年份min']
print(data_term_fin.head())
# 计算任期
出生年份 年份max 姓名 年份min 任期
0 1951.0 2009 丁海中 2003 6
1 1948.0 2003 丁耀民 2000 3
2 1951.0 2007 丁解民 2001 6
3 1964.0 2007 万庆良 2005 2
4 1957.0 2010 丰立祥 2008 2
# 绘制图表1:任期与出生年份关系
fig_q3_1 = plt.figure(figsize = (8,4))
# 创建一个图表,大小为8*4
plt.scatter(data_term_fin['出生年份'],data_term_fin['任期'],color = 'black', alpha=0.2, s = 10)
plt.title('任期与出生年份关系')
plt.xlabel('出身年份')
plt.ylabel('任期(年)')
plt.grid(True)
plt.show()
# 创建散点图,aplha代表透明度 → 点颜色叠加,s代表点大小,
# 参数添加,grid添加网格
# plt.show():显示图表
# 绘制图表2:任期与出生年份关系 - 热图
fig_q3_2 = plt.figure(figsize = (8,4))
# 创建一个图表,大小为8*4
df = pd.crosstab(data_term_fin['任期'], data_term_fin['出生年份'])
print(df.head())
print('----------')
# 整合数据
ax = fig_q3_2.add_subplot(111)
cax = ax.pcolor(df, cmap='Blues')
#cax = ax.matshow(df, cmap='Blues_r')
fig_q3_2.colorbar(cax)
plt.title('任期与出生年份关系 - 热图\n')
ax.set_xticklabels(data_term_fin['出生年份'].tolist())
plt.show()
# 创建热图,横坐标为出生年份,纵坐标为任期,
出生年份 1941.0 1942.0 1943.0 1944.0 1945.0 1946.0 1947.0 1948.0 1949.0 \
任期
0 4 2 6 5 6 7 3 5 7
1 2 3 1 6 3 6 3 6 8
2 0 2 1 4 6 9 5 11 11
3 0 0 0 1 1 4 2 4 7
4 0 0 0 0 2 1 0 0 3 出生年份 1950.0 ... 1957.0 1958.0 1959.0 1960.0 1961.0 1962.0 1963.0 \
任期 ...
0 3 ... 2 2 0 1 1 0 0
1 8 ... 13 6 4 3 1 7 1
2 5 ... 19 9 5 3 9 7 3
3 8 ... 6 5 3 4 1 4 0
4 5 ... 8 2 2 1 1 2 0 出生年份 1964.0 1965.0 1966.0
任期
0 0 1 0
1 2 0 2
2 4 0 0
3 2 2 0
4 0 1 0 [5 rows x 26 columns]
----------
panda强化练习2的更多相关文章
- [django]数据导出excel升级强化版(很强大!)
不多说了,原理采用xlwt导出excel文件,所谓的强化版指的是实现在网页上选择一定条件导出对应的数据 之前我的博文出过这类文章,但只是实现导出数据,这次左思右想,再加上网上的搜索,终于找出方法实现条 ...
- ITTC数据挖掘平台介绍(七)强化的数据库, 虚拟化,脚本编辑器
一. 前言 好久没有更新博客了,最近一直在忙着找工作,目前差不多尘埃落定.特别期待而且准备的都很少能成功,反而是没怎么在意的最终反而能拿到,真是神一样的人生. 言归正传,一直以来,数据挖掘系统的数据类 ...
- C#基础强化-进程操作
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using S ...
- JavaScript强化教程 —— Cocos2d-JS的屏幕适配方案
1. 设置屏幕适配策略(Resolution Policy) 如果你还没有用过Resolution Policy,只需要在游戏载入过程完成之后(cc.game.onStart函数回调中),调用下面的代 ...
- SQL Server 列存储索引强化
SQL Server 列存储索引强化 SQL Server 列存储索引强化 1. 概述 2.背景 2.1 索引存储 2.2 缓存和I/O 2.3 Batch处理方式 3 聚集索引 3.1 提高索引创建 ...
- 【整理】强化学习与MDP
[入门,来自wiki] 强化学习是机器学习中的一个领域,强调如何基于环境而行动,以取得最大化的预期利益.其灵感来源于心理学中的行为主义理论,即有机体如何在环境给予的奖励或惩罚的刺激下,逐步形成对刺激的 ...
- JavaScript强化教程 - 六步实现贪食蛇
1.首先创建div 并且给div加样式 <div id="pannel" style="width: 500px;height: 500px;z-index: 1; ...
- JavaScript强化教程——JavaScript 总结
本教程中我们向您讲授了如何向 html 页面添加 JavaScript,使得网站的动态性和交互性更强. 你已经学习了如何创建对事件的响应,验证表单,以及如何根据不同的情况运行不同的脚本. 你也学到了如 ...
- JavaScript强化教程 -- cocosjs场景切换
场景切换 在main.js,将StartScene作为我们初始化运行的场景,代码如下: cc.LoaderScene.preload(g_resources, function () { cc.dir ...
随机推荐
- LIRE教程之源码分析 | LIRE Tutorial of Analysis of the Source Code
LIRE教程之源码分析 |LIRE Tutorial of Analysis of the Source Code 最近在做地理图像识别和检索的研究,发现了一个很好用的框架LIRE,遂研究了一通.网上 ...
- Maven类包冲突终极三大解决技巧 mvn dependency:tree
Maven对于新手来说是<步步惊心>,因为它包罗万象,博大精深,因为当你初来乍到时,你就像一个进入森林的陌生访客一样迷茫. Maven对于老手来说是<真爱配方>,因为它无所不能 ...
- APUE(1)----UNIX基础知识
一.UNIX体系结构 所有操作系统都为他们所运行的程序提供服务,典型的服务包括:执行新程序.打开文件.读文件.分配存储区等.严格意义上来说,操作系统可以定义为一种软件,它控制计算机硬件资源,提供程序运 ...
- wpf附加属性理解
WPF附加属性 http://www.cnblogs.com/tianyou/archive/2012/12/27/2835670.html WPF属性(二)附加属性 http://blog.csdn ...
- TriggerAction扩展----ExInvokeCommandAction
Wp&Win8中使用命令绑定时,除了Button控件自带命令绑定,其他的时候是用Interactivity库中的InvokeCommandAction实现的(Win8 需要额外安装第三方NuG ...
- .net core Task.Result Wait等造成502
这两天公众号项目上线,刚开始项目运行没什么问题,但几天之后,访问量激增,服务器崩溃了,每次请求都返回502,一脸懵逼,无从下手,赶紧开日志里的BUG,拿出来一个个改,BUG都改完之后,没有明显的效果, ...
- 《Servlet和jsp学习指南》 笔记2
chapter 13 请求和响应的装饰 初步了解Decorator模式: 在不修改一个对象的类的源码的情况下,装饰这个对象的行为. chapter 14 异步处理 异步Servlet和Filter,只 ...
- leetcode 106. 从中序与后序遍历序列构造二叉树(Construct Binary Tree from Inorder and Postorder Traversal)
目录 题目描述: 示例: 解法: 题目描述: 根据一棵树的中序遍历与后序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 示例: 给出 中序遍历 inorder = [9,3,15,20,7] ...
- 老男孩Day11作业:selectors版socket
一.作业需求: 使用SELECT或SELECTORS模块实现并发简单版FTP 允许多用户并发上传下载文件 二.readme 一.作业需求: 使用SELECT或SELECTORS模块实现并发简单版FTP ...
- Jenkins持续集成企业实战系列之Jenkins配置演示-----03
注:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. 最初接触Jenkins也是由于公司需求,根据公司需求Java代码项目升级的.(公司是 ...