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 ...
随机推荐
- Linux Valgrind命令
一.简介 C/C++程序,最常见的错误之一就是内存泄露.Valgrind 是一款 Linux下的内存调试工具,它可以对编译后的二进制程序进行内存使用监测找出内存泄漏问题. Valgrind通常包括如下 ...
- 23.NULL 函数
SQL ISNULL().NVL().IFNULL() 和 COALESCE() 函数 请看下面的 "Products" 表: P_Id ProductName UnitPrice ...
- Oracle sql语句执行顺序(转)
from: http://blog.csdn.net/lailai186/article/details/12612263 sql语法的分析是从右到左 一.sql语句的执行步骤:1)语法分析,分析语句 ...
- redis的一些简介
Redis是Remote Dictionary Server的缩写,他本质上一个Key/Value数据库,与Memcached类似的NoSQL型数据库. 1. redis的数据类型: st ...
- MySQL性能调优与架构设计——第2章 MySQL架构组成
第2章 MySQL架构组成 前言 麻雀虽小,五脏俱全.MySQL 虽然以简单著称,但其内部结构并不简单.本章从MySQL物理组成.逻辑组成,以及相关工具几个角度来介绍 MySQL 的整体架构组成, ...
- XE下 SVG格式的图标使用方法
下载一个SVG格式的图标,千图网,http://tool.58pic.com/tubiaobao/ 用txt文本打开SVG图标 拖一个PathLabel控件 在PathLabel控件的Data属性添加 ...
- CreateExcel 导出Excel
public class CreateExcel { /// <summary> /// 用Excel组件导出Excel文件 /// </summary> /// <pa ...
- C# System.Threading.Timer 定时器
前提: 需要引入 System.Threading: 描述: 在很多时间我们都需要进行延迟执行,或是定时执行一些指定业务,这个时候使用 Timer 是最合适的,而且 Timer 是Cpu 级别处理对 ...
- C# 给图片添加透明的文字、图片水印
#region 添加水印 /// <summary> /// 添加文字水印 /// </summary> /// <param name="image" ...
- 倍增求lca(模板)
定义LCA,最近公共祖先,是指一棵树上两个节点的深度最大的公共祖先.也可以理解为两个节点之间的路径上深度最小的点.我们这里用了倍增的方法求了LCA.我们的基本的思路就是,用dfs遍历求出所有点的深度. ...