对比excel,轻松学习python数据分析

对比excel,轻松学习python数据分析

一直想把excel和python关联起来,加深学习pandas的印象,正好在知乎上找到@天天 提到的的《对比excel,轻松学习python数据分析》这本书,紧接着又搜到了苏克1900:像 Excel 一样使用 python 进行数据分析 这篇专栏文章,文章写得很全,遂在jupyte notebook上重写了一遍里面的代码,以供对照学习。按照书中目录,总共分为如下部分:
对比excel,轻松学习python数据分析_第1张图片

一、生成数据表

import numpy as np
import pandas as pd

# 创建数据表
df = pd.DataFrame({"id":[1001,1002,1003,1004,1005,1006],
                   "date":pd.date_range('20130102', periods=6),
                   "city":['Beijing ', 'SH', ' guangzhou ', 'Shenzhen', 'shanghai', 'BEIJING '],
                   "age":[23,44,54,32,34,32],
                   "category":['100-A','100-B','110-A','110-C','210-A','130-F'],
                   "price":[1200,np.nan,2133,5433,np.nan,4432]},
                   columns =['id','date','city','category','age','price'])
df #打印结果

	id	date	city	category	age	price
0	1001	2013-01-02	Beijing	100-A	23	1200.0
1	1002	2013-01-03	SH	100-B	44	NaN
2	1003	2013-01-04	guangzhou	110-A	54	2133.0
3	1004	2013-01-05	Shenzhen	110-C	32	5433.0
4	1005	2013-01-06	shanghai	210-A	34	NaN
5	1006	2013-01-07	BEIJING	130-F	32	4432.0

二、数据表检查

#查看数据表的维度,对应excel CTRL+向下 CTRL+向右
df.shape
(6, 6)
# 数据表信息
df.info()
# 查看数据格式,Excel中通过选中单元格并查看开始菜单中的数值类型来判断数据的格式
df.dtypes
# 查看空值,对应excel CTRL+G定位空值
df.isnull()
# 查看唯一值,Excel 中查看唯一值的方法是使用“条件格式”对唯一值进行颜色标记
df['city'].unique()
# 查看数据表数值
df.values
# 查看列名称
df.columns
# 查看前10行数据 
df.head(10)
# 查看后10行数据 
df.tail(10)

三、数据表清洗

# 处理空值(删除或填充),对应excel查找和替换——删除数据表中含有空值的行
df.dropna(how="any")
#使用数字 0 填充数据表中空值
df.fillna(value=0)
#使用均值填充数据表中空值
df['price']=df['price'].fillna(df['price'].mean())
# 清理空格,清除city 字段中的字符空格
df['city']=df['city'].map(str.strip)
# 大小写转换
df['city']=df['city'].str.lower()
# 更改数据格式,Excel 中通过“设置单元格格式”功能可以修改数据格式
df['price'].astype('int')
# 更改列名称
df.rename(columns={'category': 'category-size'})
# 删除重复值,Excel 的数据目录下有“删除重复项”的功能
df['city'].drop_duplicates()
df['city'].drop_duplicates(keep='last')#保留最后一个重复值
# 数值修改及替换,Excel 中使用“查找和替换”功能就可以实现数值的替换
df['city'].replace('sh','shanghai')

四、数据预处理

# 数据表合并
#先创建 df1 数据表
df1=pd.DataFrame({"id":[1001,1002,1003,1004,1005,1006,1007,1008],
"gender":['male','female','male','female','male','female','male','female'],
"pay":['Y','N','Y','Y','N','Y','N','Y',],
"m-point":[10,12,20,40,40,40,30,20]})
#数据表匹配合并,inner 模式, 在 Excel 中没有直接完成数据表合并的功能,可以通过 VLOOKUP 函数分步实现
df_inner=pd.merge(df,df1,how="inner")
df_inner
#其他数据表匹配模式
df_left=pd.merge(df,df1,how='left')
df_right=pd.merge(df,df1,how='right')
df_outer=pd.merge(df,df1,how='outer')
df_outer
# 设置索引列
df_inner.set_index('id')
# 排序(按索引,按数值),Excel 中可以通过数据目录下的排序按钮直接对数据表进行排序
df_inner.sort_index()
df_inner.sort_values(by=['age']) #按列排序需要增加by 参数
# 数据分组,Excel 中可以通过 VLOOKUP 函数进行近似匹配来完成对数值的分组,或者使用“数据透视表”来完成分组
df_inner['group']=np.where(df_inner['price']>3000,'high','low')#有点类似excel的if函数
df_inner
#对复合多个条件的数据进行分组标记
df_inner.loc[(df['city']=='beijing')&(df['price']>4000),'sigh']=1
df_inner
# 数据分列 Excel 中的数据目录下提供“分列”功能
#对 category 字段的值依次进行分列,并创建数据表,索引值为 df_inner 的索引列,列名称为 category 和 size
split=pd.DataFrame((x.split('-') for x in df['category']),index=df_inner.index,columns=['category','size'])
#将完成分列后的数据表与原 df_inner 数据表进行匹配 
pd.merge(df_inner,split,right_index=True,left_index=True)  #right_index和left_index相当于唯一字段

五、数据提取

# 按标签提取(loc), Loc 函数按数据表的索引标签进行提取,iloc,ix现在用的少,暂时不提及 
# 按索引标签提取单行的数值
df_inner.loc[3]
#按索引提取区域行数值
df_inner.loc[0:5]
#重设索引
df_inner.reset_index()
#设置日期为索引
df_inner.set_index('date')
# 提取 4 日之前的所有数据
df_inner.loc[:"2013-01-04"]
# 按条件提取(区域和条件值),使用 isin 函数对 city 中的值是否为 beijing 进行判断。
df_inner['city'].isin(['beijing'])#返回布尔值
df_inner.loc[df_inner['city'].isin(['beijing'])]#返回布尔值为True的值
# 数值提取还可以完成类似数据分列的工作,从合并的数值中提取出制定的数值。
category=df_inner['category']
pd.DataFrame(category.str[:3])  #提取前三个字符,并生成数据表

六、数据筛选

# 使用与,或,非三个条件配合大于,小于和等于对数据进行筛选,并进行计数和求和。与 excel 中的筛选功能和 countifs 和 sumifs 功能相似

# 按条件筛选(与&,或|,非!=),Excel 数据目录下提供了“筛选”功能,用于对数据表按不同的条件进行筛选。
# 使用“与”条件进行筛选,条件是年龄大于 25 岁,并且城市为 beijing
df_inner.loc[(df_inner['age']>25)&(df_inner['city']=='beijing')]
# 使用“或”条件进行筛选,年龄大于 25 岁或城市为 beijing。筛选后有 6 条数据符合要求。
df_inner.loc[(df_inner['age']>25) | (df_inner['city']=='beijing')]
#使用“非”条件进行筛选,城市不等于 beijing。将筛选结果按 id 列进行排序(sort函数只能对列表使用,报错)
df_inner.loc[(df_inner['age'] > 25) | (df_inner['city'] != 'beijing'), ['id','city','age','category','gender']].sort_values(by=['age'])
# 在前面的代码后增加 price 字段以及 sum 函数,按筛选后的结果将 price 字段值进行求和,相当于 excel 中 sumifs 的功能。
df_inner.loc[(df_inner['age'] > 25) | (df_inner['city'] == 'beijing'),['id','city','age','category','gender','price']].sort_values(by=['age']).price.sum()
# 还有一种筛选的方式是用 query 函数
df_inner.query('city==["beijing","shanghai"]')#单引号里面要用双引号,否则会报错
#对筛选后的结果按 price 进行求和
df_inner.query('city==["beijing","shanghai"]').price.sum()

七、数据汇总

# Excel 中使用分类汇总和数据透视可以按特定维度对数据进行汇总,python 中使用的主要函数是 groupby 和 pivot_table

# 分类汇总,对所有列进行计数汇总
df_inner.groupby('city').count()
pd.crosstab(df_inner['city'],df_inner['age'])#使用crosstab可以实现单列计数汇总
# 对特定的 ID 列进行计数汇总
df_inner.groupby('city')['id'].count()
#对两个字段进行汇总计数
df_inner.groupby(['city','size'])['id'].count()
# 除了计数和求和外,还可以对汇总后的数据同时按多个维度进行计算 /按城市对 price 字段进行汇总,并分别计算 price 的数量,总金额和平均金额
df_inner.groupby('city')['price'].agg([len,np.sum,np.mean])#len这里代表的是列表中的项目个数,非字符串的长度

# 数据透视,Excel 中的插入目录下提供“数据透视表”功能对数据表按特定维度进行汇总
# 设定 city 为行字段,size 为列字段,price 为值字段。分别计算 price 的数量和金额并且按行与列进行汇总。
pd.pivot_table(df_inner,index=['city'],columns=['size'],values=['price'],aggfunc=[len,np.sum],fill_value=0,margins=True)#margins相当于行列汇总

八、数据统计

# 主要介绍数据采样,标准差,协方差和相关系数的使用方法
# 数据采样,Excel的数据分析功能中提供了数据抽样的功能,Python 通过 sample 函数完成数据采样
#简单的数据采样
df_inner.sample(n=3)
#手动设置采样权重
weights=[0,0,0,0,0.5,0.5]
df_inner.sample(n=2,weights=weights)
# Sample 函数中还有一个参数 replace,用来设置采样后是否放回
#采样后不放回
df_inner.sample(n=6, replace=False)
#采样后放回,'replace'就是重复的意思。即可以重复对元素进行抽样,也就是所谓的有放回抽样
df_inner.sample(n=6, replace=True)  
# 描述统计,Excel 中的数据分析中提供了描述统计的功能。Python 中可以通过 Describe 对数据进行描述统计
df_inner.describe()
#数据表描述性统计
df_inner.describe().round(2).T #round设置小数点后位数,T代表转置
# 标准差 Python 中的 Std 函数用来接算特定数据列的标准差
df_inner['price'].std()
# 协方差,python 中通过 cov 函数计算两个字段或数据表中各字段间的协方差
df_inner['price'].cov(df_inner['m-point'])
# 相关分析,python 中通过 corr 函数完成相关分析的操作,并返回相关系数
df_inner['price'].corr(df_inner['m-point'])
#数据表相关性分析
df_inner.corr()

以下是目前需要自己反复多次看的地方暂时备注一下

#对 category 字段的值依次进行分列,并创建数据表,索引值为 df_inner 的索引列,列名称为 category 和 size
split=pd.DataFrame((x.split('-') for x in df['category']),index=df_inner.index,columns=['category','size'])
#将完成分列后的数据表与原 df_inner 数据表进行匹配 
pd.merge(df_inner,split,right_index=True,left_index=True)  #right_index和left_index相当于唯一字段


五、数据提取

>>> df_inner.loc[:"2013-01-04"]


>>> pd.DataFrame(category.str.split('-'))
		      
   category
0  [100, A]
1  [100, B]
2  [110, A]
3  [110, C]
4  [210, A]
5  [130, F]
>>> pd.DataFrame(category.str.split('-')[:3])
		      
   category
0  [100, A]
1  [100, B]
2  [110, A]


#使用“非”条件进行筛选,城市不等于 beijing。将筛选结果按 id 列进行排序(sort函数只能对列表使用,报错)
df_inner.loc[(df_inner['age'] > 25) | (df_inner['city'] != 'beijing'), ['id','city','age','category','gender']].sort_values(by=['age'])
# 在前面的代码后增加 price 字段以及 sum 函数,按筛选后的结果将 price 字段值进行求和,相当于 excel 中 sumifs 的功能。
df_inner.loc[(df_inner['age'] > 25) | (df_inner['city'] == 'beijing'),['id','city','age','category','gender','price']].sort_values(by=['age']).price.sum()

七、数据汇总

# Excel 中使用分类汇总和数据透视可以按特定维度对数据进行汇总,python 中使用的主要函数是 groupby 和 pivot_table

# 分类汇总,对所有列进行计数汇总
df_inner.groupby('city').count()
pd.crosstab(df_inner['city'],df_inner['age'])#使用crosstab可以实现单列计数汇总

#对两个字段进行汇总计数
**df_inner.groupby(['city','size'])['id'].count()**


# 除了计数和求和外,还可以对汇总后的数据同时按多个维度进行计算 /按城市对 price 字段进行汇总
   ,并分别计算 price 的数量,总金额和平均金额
df_inner.groupby('city')['price'].agg([len,np.sum,np.mean])#len这里代表的是列表中的项目个数,非字符串的长度


size 错误
# 数据透视,Excel 中的插入目录下提供“数据透视表”功能对数据表按特定维度进行汇总
# 设定 city 为行字段,size 为列字段,price 为值字段。分别计算 price 的数量和金额并且按行与列进行汇总。
**pd.pivot_table(df_inner,index=['city'],columns=['size'],values=['price'],aggfunc=[len,np.sum],fill_value=0,margins=True)#margins相当于行列汇总**

八、数据统计

参考:
https://zhuanlan.zhihu.com/p/66514096
https://zhuanlan.zhihu.com/p/62691924

你可能感兴趣的:(对比excel,轻松学习python数据分析)