Pandas练习
背景介绍
本数据集包括了2015年至2017年我国36个主要一线城市、特区的一些年度数据,包括产值、人口、就业、教育、医疗、经济贸易、房地产投资等方面。
包含文件:
- 2015年国内主要城市年度数据.csv
- 2016年国内主要城市年度数据.csv
- 2017年国内主要城市年度数据.csv
数据特征
| 数据集名称 | 数据类型 | 特征数 | 包含城市数量 | 缺失值 | 相关人物 |
|---|---|---|---|---|---|
| 国内主要城市年度数据 | 数值型、字符型 | 13 | 36 | 有 | 描述性分析(可视化)等 |
数据属性
| NO | 字段名称 | 数据类型 | 字段描述 |
|---|---|---|---|
| 1 | 地区 | String | 城市名称 |
| 2 | 年份 | Int | 数据所对应的时间 |
| 3 | 国内生产总值 | Float | 单位:亿元 |
| 4 | 第一产业增加值 | Float | 单位:亿元 |
| 5 | 第二产业增加值 | Float | 单位:亿元 |
| 6 | 第三产业增加值 | Float | 单位:亿元 |
| 7 | 社会商品零售总额 | Float | 单位:亿元 |
| 8 | 货物进出口总额 | Float | 单位:百万美元 |
| 9 | 年末总人口 | Float | 单位:万人 |
| 10 | 在岗职工平均工资 | Int | 单位:元 |
| 11 | 普通高等学校在校学生数 | Float | 单位:万人 |
| 12 | 医院、卫生院数 | Int | 单位:个 |
| 13 | 房地产开发投资额 | Float | 单位:亿元 |
数据来源
国家统计局:https://data.stats.gov.cn/easyquery.htm?cn=E0105
分析非常常用的知识点,知识点概述如下:
1、数据集基本信息探索
数据基本情况
数量探索
相关性分析
绘总统计
数据抽样
2、应用函数 apply
3、合并数据
4、索引问题
5、排序问题
6、重复数据处理
7、数据分组
8、处理缺失值
9、选择数据
10、pandas时间序列
11、pandas可视化
1、pandas 基本信息探索
(1) 基本情况
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
中文设置
plt.rcParams['font.sans-serif'] = ["SimHei"]
df = pd.read_csv('data/2015年国内主要城市年度数据.csv')
print('--' * 20, '\n【1】数据集基本情况探索')
print('\n>>>样本形状:\n', df.shape) # 样本形状、样本数、特征数探索
print('\n>>>样本索引、列名探索:\n', df.index, df.columns) # 样本索引、索引转换成列表、列名探索
print('\n>>>某列类型、全部样本类型探索:\n', df['年份'].dtypes, '\n', df.dtypes) # 某列类型、全部样本类型探索
print('\n>>>')
print(df.info())
(2) 数量探索
探索某列、全部样本非 NA 值的数量
print(df['年份'].count(), '\n', df.count())
探索某列的值,也可以探索全部样本的值
df['年份'].values
value_counts探索某列中各元素值出现的次数(只能探索某列的)
count 计算每列或每行的非NA单元格。
df['第一产业增加值'].value_counts().head()
df['年份'].value_counts().head()
unique()函数用于获取Series对象的唯一值。唯一性按出现顺序返回。基于哈希表的唯一,因此不排序
print("唯一值:\n",df['国内生产总值'].unique())
nunique唯一值得数量
print("\n唯一值的数量:\n",df['国内生产总值'].nunique())
print("唯一值:\n",df['年份'].unique())
nunique唯一值得数量
print("\n唯一值的数量:\n",df['年份'].nunique())
探索每一列缺失值数量
print("探索每一列缺失值数量:\n",df.isnull().sum())
不是缺失值数量
print("\n不是缺失值数量:\n",df.notnull().sum())
某列取值、多列取值
print('取出一列:\n', df['年份'].head(),"类型:",type(df['年份']))
#取出多列:
print('\n取出多列:\n', df[['地区', '年份']].head(), "类型:", type(df[['地区', '年份']]))
(3) 相关性分析
探索特征之间相关性
探索某列、全部样本的方差
print('年末总人口方差:\n', df['年末总人口'].var())
print('\n总体数据方差:\n', df.var(), )
探索某列、全部样本的标准差
print('年末总人口标准差:\n', df['年末总人口'].std())
print('\n总体数据标准差:\n', df.std(), )
(4) 汇总统计
样本数据汇总统计
每一列求和
print('每一列求和:\n', df.sum())
某列逐行累加(可以全部样本每一列都累加)
print(df['地区'].cumsum().head())
最大最小值
print('最大值>>>\n', df.max().head())
print('\n最小值>>>\n', df.min().head())
返回 '国内生产总值' 列最大、最小值所对应的索引号
print('\n>>>', df['国内生产总值'].idxmax(), '\n', df['国内生产总值'].idxmin())
print('\n>>>', df.mean(), df.median()) # 平均值、中位数
汇总统计信息,是上面方法的统一
print('\n>>>', df.describe().T)
df.describe()
for (columnName, columnData) in df.iteritems():
print('Colunm Name : ', columnName)
print('Column Contents : ', columnData.values)
print("===============")
(5) 数据抽样
有时候我们做研究分析或者数据量过大时,
只希望抽取一部分数据做研究,因此要进行数据抽样处理
replace允许或不允许对同一行进行多次采样,默认就是False
data = df.sample(n=5, replace=False) # 不放回随机抽样 5 个数据
data
2、pandas 中的应用函数 apply
我们发现数据集中有浮点型数据,但是我们只需要整形数据,
因此我们很有必要使用应用函数对原数据进行类型转换
def fun(x):
x = int(x)
return x
data1 = df['国内生产总值'].apply(fun)
data1.head()
data2 = df['地区'].apply(lambda x: x + 'QQ')
data2.head()
data3 = df.iloc[:, :].apply(np.sum)
data3.head()
3、合并数据
df1 = pd.read_csv('data/2015年国内主要城市年度数据.csv')
df2 = pd.read_csv('data/2016年国内主要城市年度数据.csv')
df3 = pd.read_csv('data/2017年国内主要城市年度数据.csv')
#通常用来连接DataFrame对象。默认情况下是对两个DataFrame对象进行纵向连接,
当然通过设置参数,也可以通过它实现DataFrame对象的横向连接
df_1 = pd.concat(objs=[df1, df2, df3]) # 合并数据,以行的维度合并
df_1.sample(n=7, replace=False) # 随机不放回抽样 7 个数据
以指定值合并,在本案例中不适用
df_2 = pd.merge(left=df1, right=df2, on='地区', how='outer')
df_2
4、索引问题
单个索引,inplace=False 不覆盖的情况下,
要使用一个变量 来间接操作
设置索引时的情况
d = df_1.set_index(keys='年份')
print(d.iloc[: , :4].head())
注意在取消索引操作时,inplace=True 设置为 True,以便后面可以查看到取消后的情况
d.reset_index(inplace=True)
d.iloc[: , :4].head() # 取消索引时的情况
多级索引
inplace=True 覆盖的情况下,直接使用 df_1 访问.
注意:
在 inplace=True 覆盖原数据情况下,运行第 2 或多次,
就会出现报错的情况,同时代码并没有语法错误,
原因是原数据被覆盖了。解决方法是:重新运行所有代码,
如果不是很必要,尽量不要执行覆盖原数据的操作
df_1.set_index(keys=['地区', '年份'], inplace=True) # 设置多级索引,覆盖原数据
print(df_1.iloc[: , :4].head())
df_1.reset_index(inplace=True)
df_1.iloc[: , :4].head()
5、排序问题
通过索引排序
data = df_1.sample(n=5, replace=False) # 通过随机不放回抽样 5 个数据
通过索引排列,升序排列、不覆盖原数据、如有缺失值则放在前面
data.sort_index(ascending=True, na_position='first')
多重索引的dataframe
dataframe.sort_index(level=[0,1],ascending=[False,True])`
- level 按指定索引级别的值排
通过指定列的值排序
df_1.sort_values(by=['地区', '年份'], ascending=[True, False], inplace=False, na_position='first').head(7)
6、重复数据处理
返回唯一值
print('\n>>>', df_1['地区'].unique()) # 唯一值元素
print('\n>>>\n', df_1.nunique()) # 唯一值数量
重复值处理
查找重复值
print('>>>\n', df_1.duplicated(subset=['年份'], keep='first').head())
删除重复值
print('>>>\n', df_1.drop_duplicates(subset=['年份'], keep='first', inplace=False).iloc[:, :4])
查找重复索引
print('\n>>>', df_1.index.duplicated())
7、数据分组
指定一列是聚合列,如:年份
'地区'作为索引分组,'年份'与分组列'地区'聚合
第一种方法
df_1.groupby(by=['地区'], as_index=True).agg({'年份': ['max', 'min', 'median']}).head()
第二种方法,两种方法是等效的
df_1.groupby(by=['地区'], as_index=True).年份.agg(['max', 'min', 'median']).head()
指定多列列是聚合列,如:年份、国内生产总值
df_1.groupby(by=['地区'], as_index=True).agg({'年份': 'max', '国内生产总值': 'describe'}).head()
没有指定聚合列,则代表选择所有列
返回所有列中的最大值
df_1.groupby(by=['地区'], as_index=True).max().head()
8、处理缺失值
在上面的探索中,发现有缺失值,因此有必要进行处理
查看所有数据的缺失情况
df_1.isnull().sum()
第一种方法,删除缺失值数据
df_1.dropna().isnull().sum()
第二种方法,使用填充法填充缺失值
print('\n>>>\n', df1.fillna(method='ffill').head()) # 使用缺失值的前一个值填充(前向填充)
print('>>>\n', df1.fillna(method='bfill').head()) # 使用缺失值的后一个值填充(后向填充)
''' 平均值填充(所有列填充) '''
print('>>>\n', df_1.fillna(value=df_1.mean()).head())
9、选择指定的数据
按标签选择
按行的序号、列的名称选择
df.loc[:, '列名']/df.loc[[0,1, 2], ['列名1', '列名2']]
print('>>>\n', df_1.loc[:, '年份'].head())
print('>>>\n', df_1.loc[[0, 4, 7], ['年份', '国内生产总值']].head())
按位置选择
按行位置(序号)、列位置选择
df.iloc[:, :]/da.iloc[[0, 1, 2], [2, 3, 4]]
print('>>>\n', df_1.iloc[:3, :3])
print('>>>\n', df_1.iloc[[1, 34, 56], [2, 4, 8]])
按条件来选择
筛选出符合条件的列
df_1 = df_1.set_index(["地区","年份"])
国内生产总值大于15678的数据
df_1[df_1['国内生产总值'] > 15678].head()
选择任一值大于1000的列
df_1.loc[:, (df_1>10000).any()]
选择所有值大于1000的列
df_1.loc[:, (df_1>1000).all()]
df_1.loc[:, df_1.isnull().any()] # 选择含 NaN值的列
df_1.loc[:, df_1.notnull().all()] # 选择不含NaN值的列
query和filter
在使用pandas进行数据分析时,经常遇到需要过滤信息的场景,此时我们可以用到2种函数,query和filter。
query函数
query函数我认为类似sql语言中的where,可以对dataframe中的特定column进行筛选。具体语法如下:
df.query('列名 判断 值'),如df.query('column1 > 2 and column 2<1')
等于
df[df[列名] 判断 值],如 df[df[column1]>2 & df[column2]<1]
filter函数
filter常规用法,在pandas说明里很好找到:
DataFrame.filter(items=None, like=None, regex=None, axis=None)
#items对列进行筛选#regex表示用正则进行匹配#like进行筛选#axis=0表示对行操作,axis=1表示对列操作
选择指定的列,类似于 df[['某列', '某列']]
df_1.filter(items=['地区', '年份']) # 选择指定的列
df_1.filter(like='产业', axis=1) # 选择含有 "产业" 的列
完整代码
from random import sample
import pandas as pd
df = pd.read_csv("./2015年国内主要城市年度数据.csv")
# values_count
v_c = df["年份"].value_counts()
# print(v_c) # 2015 36
# Name: 年份, dtype: int64
# 唯一值
un = df["年份"].unique() # 唯一值
# print(un) # [2015]
un_num = df["年份"].nunique() # 唯一值的数量
# print(un_num) # 1
# 探索缺失值
# print(df.isnull().sum()) # 缺失
# print(df.notnull().sum()) # 完整
# 相关性分析
# print("年末总人口方差:\n", df["年末总人口"].var())
# print("总体数据方差:\n", df.var())
# print("年末总人口标准差:\n", df["年末总人口"].std())
# print("总体数据标准差:\n", df.std())
# 循环取出dec的值
# for (column_name, column_data) in df.describe().iteritems():
# print(column_name + ": ")
# print(column_data.values)
# 数据采样
# sample_data = df.sample(n=5, replace=False)
# print(sample_data)
# print("================")
# 数据合并
df1 = pd.read_csv("./2015年国内主要城市年度数据.csv")
df2 = pd.read_csv("./2016年国内主要城市年度数据.csv")
df3 = pd.read_csv("./2017年国内主要城市年度数据.csv")
df_1 = pd.concat(objs=[df1, df2, df3], axis=0)
sample_df_1 = df_1.sample(n=6, replace=False)
# print(sample_df_1)
# 将年份设置成索引
df11 = df.set_index("年份", inplace=False)
# print(df11.iloc[:,:4].head())
df12 = df11.reset_index(inplace=False)
# print(df12.iloc[:,:4].head())
# 找出重复值
print(df_1.duplicated(subset=["年份"], keep="last")) # 最后一个出现的重复值为False
print(df_1.duplicated(subset=["年份"], keep="first")) # 第一个出现的重复值为False
print(df_1.duplicated(subset=["年份"], keep=False)) # 重复值都为True
# 删除重复值
print(df_1.head())
df_drop_val = df_1.drop_duplicates(subset=["年份"], keep="first")
print(df_drop_val)
#
Pandas练习的更多相关文章
- pandas基础-Python3
未完 for examples: example 1: # Code based on Python 3.x # _*_ coding: utf-8 _*_ # __Author: "LEM ...
- 10 Minutes to pandas
摘要 一.创建对象 二.查看数据 三.选择和设置 四.缺失值处理 五.相关操作 六.聚合 七.重排(Reshaping) 八.时间序列 九.Categorical类型 十.画图 十一 ...
- 利用Python进行数据分析(15) pandas基础: 字符串操作
字符串对象方法 split()方法拆分字符串: strip()方法去掉空白符和换行符: split()结合strip()使用: "+"符号可以将多个字符串连接起来: join( ...
- 利用Python进行数据分析(10) pandas基础: 处理缺失数据
数据不完整在数据分析的过程中很常见. pandas使用浮点值NaN表示浮点和非浮点数组里的缺失数据. pandas使用isnull()和notnull()函数来判断缺失情况. 对于缺失数据一般处理 ...
- 利用Python进行数据分析(12) pandas基础: 数据合并
pandas 提供了三种主要方法可以对数据进行合并: pandas.merge()方法:数据库风格的合并: pandas.concat()方法:轴向连接,即沿着一条轴将多个对象堆叠到一起: 实例方法c ...
- 利用Python进行数据分析(9) pandas基础: 汇总统计和计算
pandas 对象拥有一些常用的数学和统计方法. 例如,sum() 方法,进行列小计: sum() 方法传入 axis=1 指定为横向汇总,即行小计: idxmax() 获取最大值对应的索 ...
- 利用Python进行数据分析(8) pandas基础: Series和DataFrame的基本操作
一.reindex() 方法:重新索引 针对 Series 重新索引指的是根据index参数重新进行排序. 如果传入的索引值在数据里不存在,则不会报错,而是添加缺失值的新行. 不想用缺失值,可以用 ...
- 利用Python进行数据分析(7) pandas基础: Series和DataFrame的简单介绍
一.pandas 是什么 pandas 是基于 NumPy 的一个 Python 数据分析包,主要目的是为了数据分析.它提供了大量高级的数据结构和对数据处理的方法. pandas 有两个主要的数据结构 ...
- pandas.DataFrame对行和列求和及添加新行和列
导入模块: from pandas import DataFrame import pandas as pd import numpy as np 生成DataFrame数据 df = DataFra ...
- pandas.DataFrame排除特定行
使用Python进行数据分析时,经常要使用到的一个数据结构就是pandas的DataFrame 如果我们想要像Excel的筛选那样,只要其中的一行或某几行,可以使用isin()方法,将需要的行的值以列 ...
随机推荐
- 机器学习-决策树系列-决策树-剪枝-CART算法-27
目录 1. 剪枝 2. CCP-代价复杂度剪枝(CART) 4. α值的确定 1. 剪枝 将子树还原成一个叶子节点: 是解决过拟合的一个有效方法.当树训练得过于茂盛的时候会出现在测试集上的效果比训练集 ...
- steam无法登陆/更新客户端
1.问题 最近CS2更新,正准备尝试游玩一下,发现提示要使用最新版本客户端,在检查steam客户端更新时,却发现检查更新失败,无法更新,有可能是丢失了某些文件导致的. (之前有过一次重新安装的经历,但 ...
- Android Studio 的 Gradle 面板没有 Task
问题描述:Android Studio Gradle 窗口没有显示 task 列表的问题,如下图所示: 网上找了好久都没有找到原因,最后自己摸索,找了解决方法. 解决方法:依次点击:File -> ...
- Go-并发安全map
- [转帖]Redhat 8 磁盘调度策略变化:NOOP改为NONE
说明 在 redhat 4/5/6/7版本中的NOOP调度策略,从8开始修改为NONE,官方解释: none Implements a first-in first-out (FIFO) schedu ...
- 【转帖】让互联网更快:新一代QUIC协议在腾讯的技术实践分享
https://www.cnblogs.com/jb2011/p/8458549.html 本文来自腾讯资深研发工程师罗成在InfoQ的技术分享. 1.前言 如果:你的 App,在不需要任何修改的情况 ...
- [转帖] 这grep咋还不支持\d呢(BRE,ERE,PCRE)
https://www.cnblogs.com/codelogs/p/16060372.html 简介# 对于刚使用Linux不久的同学,肯定会遇到这个问题,就是用grep匹配数字时,发现\d匹配不了 ...
- 从好玩到好用:程序员用AI提效的那些事儿
本片内容是[AI思维空间]ChatGPT纵横编程世界,点亮智慧火花的续作,主要记录组内开发小伙伴儿们在开发过程中的实际应用案例,记录典型案例,尽量不要和其他人重复,以解决开发过程中的实际问题为主,设计 ...
- 【K哥爬虫普法】倒计时21天!事关爬虫er们能否平安回家过年!
我国目前并未出台专门针对网络爬虫技术的法律规范,但在司法实践中,相关判决已屡见不鲜,K 哥特设了"K哥爬虫普法"专栏,本栏目通过对真实案例的分析,旨在提高广大爬虫工程师的法律意识, ...
- 强化学习从基础到进阶-案例与实践[4.2]:深度Q网络DQN-Cart pole游戏展示
强化学习从基础到进阶-案例与实践[4.2]:深度Q网络DQN-Cart pole游戏展示 强化学习(Reinforcement learning,简称RL)是机器学习中的一个领域,区别与监督学习和无监 ...