《对比excel,轻松学习python数据分析》学习笔记
文章目录
- 前言
- 为什么要学习python
- 为什么要对比excel学习python
- 第1章 数据分析基础
- 数据分析的作用
- 数据分析的内容
- 数据分析的流程
- 第2章 python基础知识
- 1.python介绍
- 2.python的下载与安装
- 3.python的基本概念
- 4.字符串
- 5.数据结构——列表
- 6.数据结构——字典
- 7.数据结构——元组
- 8.运算符
- 9.循环语句
- for循环
- while循环
- 10.条件语句
- if语句
- else语句
- elif语句
- 11.函数
- 12.高级特征
- 列表生成式
- map 函数
- 第3章 pandas数据结构
- series数据结构
- DataFrame表格型数据结构
- 第4章 获取数据源
- 导入外部数据
- 新建数据
- 熟悉数据
- 第5章 数据预处理
- 缺失值处理
- 重复值处理
- 异常值的检测与处理
- 数据类型转换
- python的数据类型
- 类型转换
- 索引设置
- 第6章 数据选择
- 第7章 数值操作
- 数值替换
- 数值排序
- 数值排名
- 数值删除
- 删除列
- 删除行
- 数值计数
- 唯一值获取
- 数值查找
- 区间切分
- 插入新的行列
- 行列互换
- 索引重塑
- 长宽表转换
- 宽表转换为长表
- 长表转换为宽表
- apply()与applymap()函数
- 第8章 数据运算
- 算术运算
- 比较运算
- 汇总运算
- 第9章 时间序列
- 获取当前时刻的时间
- 指定日期和时间的格式
- 字符串和时间格式的相互转换
- 时间索引
- 时间运算
- 第10章 数据分组/数据透视表
- 数据分组
- 数据透视表
- 第11章 多表拼接
- 横向拼接
- 纵向拼接
- 第12章 结果导出
- 导出为.xlsx文件
- 导出为.csv文件
- 多个sheet
- 第13章 数据可视化
- 第14章 案例分析
- 第15章 numpy数组
前言
为什么要学习python
1.处理大量数据时,python效率高于excel
2.python可以实现自动化
python比VBA更强大
3.python可以用来做算法模型
为什么要对比excel学习python
以下是本书的学习笔记
第1章 数据分析基础
数据分析的作用
1.现状分析
整体运营情况、业务构成、日报月报周报
2.原因分析
一般通过专题分析来分析原因
3.预测分析
在原因分析的基础上,对未来发展趋势做出预测
数据分析的内容
1.总体概览指标——统计绝对数
称为关键性指标
2.对比性指标
常见的有:同比、环比、差
3.集中趋势指标
4.离散程度指标
5.相关性指标
*相关关系与因果关系
数据分析的流程
1.熟悉工具
2.明确目的
3.获取数据
4.熟悉数据
5.处理数据
*异常数据
*重复数据
*缺失数据
*测试数据
6.分析数据——下钻法
7.得出结论
8.验证结论
9.展示结论
第2章 python基础知识
1.python介绍
2.python的下载与安装
本书提供的方式为 安装anaconda,利用jupyter notebook 进行学习
jupyter notebook的markdown功能—目录:
- 打开anaconda prompt
- 输入 pip install jupyter_contrib_nbextensions
- 输入 jupyter contrib nbextension install --user
- 打开jupyter,可以看到多了一个目录栏nbextensions
- 勾选上 table of contents
3.python的基本概念
数:int float
- 变量:
- 标识符:
- 数据类型:数 字符串
- 输出与输出格式设置:str.format()方法
(示例):
print('{}月{}借方余额为:{:.2f}元'.format(6,'固定资产',10000))
运行结果为:6月固定资产借方余额为:10000.00元
4.字符串
字符串的连接 +
字符串的复制 *
字符串的长度 len()
字符串的查找 in not in .find()
字符串的索引 a[]
字符串的分隔 .split()
移除字符 .strip() #默认移除空格和换行符,也可添加指定字符
5.数据结构——列表
列表的复制与合并: * +
向列表中插入新元素:.append(元素) .insert(位置,元素)
获取列表中值出现的次数 .count()
获取列表中值出现的位置 .index()
获取列表中指定位置的值:普通索引与切片索引
删除列表中的值 .pop(位置) .remove(值)
对列表中的值进行排序 .sort() #默认升序排序
6.数据结构——字典
- 将键值以列表的形式存放再元组中,可以用dict()进行转换
- test_dict[“键”]="值“
- keys()用来获取所有键
- values()用来获取所有值
- items()用来获取键值对
7.数据结构——元组
- 元组与列表类似,但元素不能修改
- 获取元组的长度: len(tup)
- 获取元组内的元素:普通索引 切片索引
- 元组与列表相互转换: list(tup)转换为列表; tuple(t_list)转换为元组
- zip()函数:将可迭代对象(列表、元组)作为参数,对应的元素打包成一个个元组,返回由这些元组组成的列表;常与for循环一起搭配使用
list_a1=["小米","小水","小菜","小白"]
list_a2=[101,102,103,104]
tup_b1=(93,98,95,94)
tup_b2=("优","优","优","优")
result=[]for i in zip(list_a1,list_a2,tup_b1,tup_b2):result.append(i)print(result)
[('小米', 101, 93, '优'), ('小水', 102, 98, '优'), ('小菜', 103, 95, '优'), ('小白', 104, 94, '优')]
8.运算符
算术运算符 | Value |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
% | 相除取余 |
** | 10**5 表示10的5次方 |
// | 相除取整 |
比较运算符 | value |
---|---|
== | 等于 |
!= or <> | 不等于(<>有的版本不可用) |
> < >= <= |
逻辑运算符 | value |
---|---|
and | |
or | |
not |
9.循环语句
for循环
可以遍历任何序列的项目
#遍历列表
subject=["excel","sql","python","统计学"]
for sub in subject:print("我目前正在学习:{}".format(sub))
我目前正在学习:excel
我目前正在学习:sql
我目前正在学习:python
我目前正在学习:统计学。
while循环
当满足条件时,执行某程序
10.条件语句
if语句
else语句
elif语句
11.函数
def 函数名(参数):语句块 语句块1: print()
语句块2:data=()
return data
普通函数与匿名函数
#普通函数
def addxy(x,y):result=x+yreturn result
addxy(1,2)#匿名函数
f=lambda x,y:x+y
f(1,2)
12.高级特征
列表生成式
#普通方法生成列表
num=[1,2,3,4,5]
new=[]
for i in num:new.append(i**2)
new#列表生成式
num=[1,2,3,4,5]
[i**2 for i in num]
例2 ,两层嵌套
#普通方法生成列表
list1=["A","B","C","D"]
list2=["a","b","c","f"]
new=[]
for m in list1 :for n in list2:new.append(m+n)
new#列表生成式
list1=["A","B","C","D"]
list2=["a","b","c","f"]
[m+n for m in list1 for n in list2]
map 函数
map(function,agrs),表示对序列agrs中的每个值进行function操作,最终得到一个结果序列
a=map(lambda x,y:x+y,[1,2,3],[3,2,1])#将map的结果存储再列表中
#方法一 for循环遍历
for i in a:print(i)#方法二 list方法
a=map(lambda x,y:x+y,[1,2,3],[3,2,1])
b=list(a)
#or
b=list(map(lambda x,y:x+y,[1,2,3],[3,2,1]))
第3章 pandas数据结构
数据分析常用的模块
import pandas as pd
import numpy as np
from matplotlib.pyplot as plt
series数据结构
series是由一组数据与一组与之相关的数据标签(即索引)组成:
- 创建一个series使用pd.series()方法;
- 获取series的索引利用index()方法;
- 获取series的值利用values()方法
import pandas as pd#传入一个列表
s1=pd.Series(["a","b","c","d","e"])
s1#传入一个列表 并指定索引
s2=pd.Series(["a","b","c","d","e"],index=[1,2,5,4,3])
s2#传入一个字典,key即为索引
s3=pd.Series({"a":1,"b":2,"c":3})
s3
注意python大小写敏感
DataFrame表格型数据结构
DataFrame是由一组数据与一对索引(行 列)
DataFrame
import pandas as pd
#传入一个列表
df1=pd.DataFrame(["a","b","c","d","e"])
df1#传入一个嵌套列表
df2=pd.DataFrame([["A","a"],["B","b"],["C","c"]])#传入一个嵌套元组的列表
df3=pd.DataFrame([("A","a"),("B","b"),("C","c")])#传入 并指定索引
df4=pd.DataFrame([["A","a"],["B","b"],["C","c"]],columns=["大写","小写"],index=[1,2,3])#传入一个字典,key即为索引
data={"小写":["a","b","c"],"大写":["A","B","C"]}
df5=pd.DataFrame(data,index=[1,2,3])
#新增一行数据
tmp_df_V=tmp_df_V.append([{'orderid':'27415245'}],ignore_index=True)#ignore_index=True 加入tmp_df_V的索引;合并两个DataFrame时设置未False则应用原来各自的索引
#append不直接对tmp_df_V进行操作,需要赋值
第4章 获取数据源
导入外部数据
导入.xlsx文件,用pd.read_excel(r"路径")
加r避免电脑默认路径中的\被转义,否则需要手动将\换成/- 参数sheet_name= 用来指定导入的sheet
参数可指定为"sheet的名字",也可指定为顺序,从0开始计 - 参数index_col指定某一列作为行索引(第几列,从0开始)
从0开始的默认索引作为 - 参数header设置列索引
从0开始计数,选择作为索引的行;可设置为none,默认为首行header=0 - 参数usecols设置需要导入的列
从0开始计数,可以切片
- 参数sheet_name= 用来指定导入的sheet
导入.csv文件 ,用pd.read_csv(r"路径")
- 参数sep指明分隔符号,默认为逗号
常见的分隔符号有:逗号 空格 制表符(\t) - 参数nrows指明读取行数
- 参数encoding指定编码格式
python常用编码格式:utf-8 gbk;默认编码格式为utf-8 - 参数engine
- 当文件路径或者文件名包含中文时,需要设置engine参数
- 默认值为"C",需要设置为"python"
- 相应也需要调整encoding的值为"utf-8-sig"或者"gbk"
- 参数sep指明分隔符号,默认为逗号
导入.txt文件 ,用
pd.read_table(r"路径",sep=" ")
pd.read_table是利用分隔符隔开的文件导入DataFrame的通用函数,sep参数为必须填写导入.sql文件
- 安装模块pip install pymysql
pd.read_table是利用分隔符隔开的文件导入DataFrame的通用函数,sep参数为必须填写
import pymysql#创建链接
eng=pymysql.connect(host='',user='',password='',db='',charset='')
#host:数据库地址/本机使用localhost
#user 用户名;password 密码
#db:数据库名
#charset:数据库编码,一般为UTF-8#写sql查询
sql='select * from table_'#导入sql
df=pd.read_sql(sql,end)
#可以设置行索引参数index_col,列索引参数columns
新建数据
可以利用pd.DataFrame()方法新建
熟悉数据
df.head(10) #预览前10行,默认5
df.shape #行数和列数,不包含索引
df.info() #查看数据类型
df.describe() #获取所有数值型字段的分布值
第5章 数据预处理
缺失值处理
#查看缺失值
df.info ()
df.isnull()
#缺失值删除
df.dropna() #参数 how="all"仅删除全为空值的行
#缺失值填充
df.fillna(值) #所有缺失值填充为指定值
df.fillna({字段名:值,字段名:值})#指定列的缺失值填充为指定值
重复值处理
import pandas as pd
df3.drop_duplicates() #删除重复项 默认保留第一个行
df3.drop_duplicates(subset="列名") #对指定列进行去重 默认保留第一个行
df3.drop_duplicates(subset=["列名1","列名2"],keep=last/False)
#列表通过多个列去重
#参数keep设置保留项,默认值为first,可以设置为last/False,False为把重复值全部删除
异常值的检测与处理
- 异常值的检测
主要有三种方式:
- 业务经验划定指标的正常范围
- 通过箱型图识别:在箱型图上下边缘以外的点称为异常值
- 服从正态分布的数据,3σ原则:μ±3σ的值为异常值
- 异常值处理
处理方式:
- 删除–最常用 #满足条件的过滤出来作为新表处理
- 把异常值当作缺失值来填充 #实则为替换,利用replace()方法
- 研究异常值的原因
数据类型转换
python的数据类型
类型 | 说明 |
---|---|
int | 整型 |
float | 浮点数 |
object | python对象类型 用O表示 |
string_ | 字符串 用S表示,S10表示长度为10的字符串 |
Unicode_ | 固定长度的Unicode类型 |
datetime64[ns] | 时间格式 |
info()方法、df[“字段”].dtype 方法
类型转换
df["列名"].astype("字段类型")
#如将一个int类型的字段转换为float类型,公式中的"字段类型"可以填写为"float64"
###
#如需要修改原DataFrame某字段类型,需要使用函数之后赋值给原字段
df1["allianceid"]=df1["allianceid"].astype("object")
索引设置
- 添加索引
- 默认用从0开始的自然数做索引
- df.columns=[“第一列”,“第二列”,…] 传入列表里的值作为列索引
- df.index=[1,2,3,4,5,6,7] 传入列表里的值作为行索引
- 重新设置索引 一般指行索引的设置
- df.set_index(“列2”) 将列2作为索引列(即行索引)
- 层次化索引:传入多个列名,用多列作索引
- 重命名索引
df.rename(columns={“原索引名”:“新索引名”},index={“原行索引名”:“新行索引名”})
- 重置索引
主要用在层次化索引表中:将索引列当作一个columns返回
df.reset_index() #默认将所有index转化为columns df.reset_index(level=0) #将第0级索引转化为columns df.reset_index(drop=True) #将原索引删掉,不加入columns;默认为False #参数inplace还可以用来设置是否修改原数据表
第6章 数据选择
#选择数据:选择7月海外的orderid和amount
df3[['orderid','amount']] #传入列名选择
df3.iloc[:,[0,11]] #传入列的位置选择——可以通过info()方法定位位置
df3.iloc[:,0:3] #选择连续的列——前3列
df3.iloc[0:10,0:3] #选择连续的行列——前3列、前10行
df3.loc[[0,1,2]] #指定行索引选择行数据
df3.iloc[0] # 选择第一行(转置显示)
df3.iloc[0:2,] #选择前两行
df3.iloc[[0,2]] #选择第一行和第三行
#选择满足条件的数据 ——布尔索引
df3[df3["star"]>=3] #选择星级为3星以上的数据
df3[(df3["star"]>=3) & (df3["isibu"]=="T")] #选择星级为3星以上且为ibu的数据 **注意双等号判断#布尔索引选择行+普通索引选择列+切片索引选择行
#df[布尔索引条件][行索引条件--切片][列索引条件--指定列名]
#其中,行、列索引条件可省略
df3[df3["star"]>=3][0:3] #选择星级为3星以上的前3行数据
df3[df3["star"]>=3][0:3][['orderid','amount']] #选择星级为3星以上的指定列的前3行数据
df3[df3["star"]>=3][['orderid','amount']] #选择星级为3星以上的指定列'orderid','amount'的数据
第7章 数值操作
数值替换
用处:异常值替换处理、缺失值填充处理等
类型:一对一替换、多对一替换、多对多替换
import numpy as np
#一对一替换
df1["countryname"].replace("香港","中国香港",inplace=True) #选中列进行替换操作,inplace默认值为False 即默认不修改原表)
df1.replace(np.NaN,'others') #对整个表的缺失值进行替换,类似 fillna()方法
#np.NaN为缺失值的一种表达方式
#多对一替换,借助列表
df1['countryname'].replace(['香港','澳门','台湾'],'中国港澳台')
#多对多替换,借助字典
df1['countryname'].replace({'香港':'中国香港','澳门':'中国澳门','台湾':'中国台湾'})
数值排序
分为升序与降序
- 按照一列进行排序
使用df.sort_values()
方法,默认升序,False为降序;
默认缺失值排在最后,设置na_position='first’可以把确实值所在列排在前面
df.sort_values(by=['col'],ascending=True/False,na_position='first' /'last')
- 按照多列数值进行排序
参数的值用列表的形式给出即可;
ascending可以只指定一个值,也可用列表对应给出不同的排序方式
数值排名
会新增一列
对应excel中的rank.avg()和rank.eq()函数
python中使用rank()
方法:
涉及参数
ascending:默认升序,=False
为降序
method:可设置四个值(average first min max)指定不同的排序方式
操作案例
- 步骤1:新建一个有重复项的dataframe——新建
tmp_df=[] tmp_df=df3['orderid'].head(10) tmp_df type(tmp_df) #得到pandas.core.series.Series 即是一个series tmp_df_V=pd.DataFrame(tmp_df) # 将数据传入到DataFrame中
- 步骤2:添加重复项的数据
一行数据#dataframe新增一行数据 tmp_df_V=tmp_df_V.append([{'orderid':'27415245'}],ignore_index=True) #ignore_index=True 加入tmp_df_V的索引;合并两个DataFrame时设置未False则应用原来各自的索引 #append不直接对tmp_df_V进行操作,需要赋值
多行数据
#借助新的dataframe传入多行数据 a = [['27415245'],['27415289'],['27415267'],[2222]] tmp_df_3=pd.DataFrame() tmp_df_3=tmp_df_3.append(a) tmp_df_3.columns=["orderid"]#修改列名,保证合并到一列 tmp3=tmp_df_3.append(tmp_df_V) #合并操作
- 步骤3:排名操作
#转换object数据类型为int tmp3["orderid"]=tmp3["orderid"].astype("int64") tmp3['orderid'].rank(method="average")#数值相同的取平均名次 tmp3['orderid'].rank(method="first") #名次唯一,数值相同的按出现顺序 tmp3['orderid'].rank(method="min")#数值相同的取最小名次 tmp3['orderid'].rank(method="max")#数值相同的取最大名次
- 步骤4:作为一列新增到原来的dataframe中
tmp3['排名']=tmp3['orderid'].rank(method="average")
数值删除
删除列
drop()方法,参数axis=1
表示删除列,axis=0
表示删除行
#备份数据 并查看数据类型
tmp_df2=df3
tmp_df2.info()#表达方式一:输入列名
tmp_df2.drop(["commission","allianceid"],axis=1)#不会直接作用在tmp_df2上#表达方式二:输入位置
tmp_df2.drop(tmp_df2.columns[[9,12]],axis=1)#表达方式三利用columns 无需axis参数
tmp_df2=tmp_df2.drop(columns=["commission","allianceid"])#并直接作用在原表格上
删除行
- drop()方法
与删除列类似,注意参数axis=0,columns换成index - 过滤条件法
df[条件]
#删除vendortype不为供应商的数据
##!注意==与=的区别
tmp_df2[tmp_df2["vendortype"]=="供应商"]
数值计数
tmp_df2["alliancetype"].value_counts(normalize=False,sort=True)
#normalize默认为False,设置为True可以输出计数占比
#sort 默认值为True,表示按计数降序排列,设置为False则按索引顺序
唯一值获取
#唯一值获取
tmp_df2["countryname"].unique()
数值查找
#数值查找
#isin()方法,可单个值或者多个值,使用方法如下
tmp_df2.isin(['香港'])
tmp_df2[tmp_df2["vendortype"]=="供应商"]["countryname"].isin(['澳门','香港'])
#tmp_df2表的vendortype为供应商中,countryname是否为香港澳门
#输出结果为true false
区间切分
对应excel的if嵌套,如年龄分层
python可用cut()方法与qcut()方法
- cut()方法
tmp_df2["amount_cate"]=pd.cut(tmp_df2["amount"],bins=[0,300,600,900,1200,1500,2000,3000,4000,6000,8000])
#参数bins设置分层的区间范围
#cut()方法的结果时左开右闭的区间
#分层结果赋值给tmp_df2最后新建一列amount_cate
tmp_df2["amount_cate"].value_counts(normalize=True)
#查看分层的分布情况
- qcut()方法
#指定分层的份数,区间范围应该是考虑数值与个数情况
tmp_df2["amount_cate2"]=pd.qcut(tmp_df2["amount"],10)
#分成10份
#分层结果赋值给tmp_df2最后新建一列amount_cate2
tmp_df2["amount_cate2"].value_counts(normalize=True)
tmp_df2["amount_cate2"].unique()
#查看分层的分布情况
插入新的行列
- 插入行:用两个表拼接的思路(可参考数值排名的案例操作)
- 插入列
insert()
方法
行列互换
.T
方法实现转置
df4.describe().T.T
索引重塑
含义:表格型数据转换到树形数据,即如将列索引变成第二层行索引,形成层次化索引;使用stack()
方法
反向操作,可以使用unstack()
方法
df4.describe().stack().unstack()
长宽表转换
宽表转换为长表
- 使用stack()方法
#1.先选取数据集进行操作
tmp_df6_1=df6[df6["orderdate"]>="2020-01"]
#set_index()方法先将无需转换的列设置成索引
#stack()方法转成行
#reset_index()索引重置
#rename()设置新的列名
tmp_df6_2=tmp_df6_1.set_index(["citylevel","star","orderdate","type"]).stack().reset_index().rename(columns={0:"data","level_4":"datatype"})
tmp_df6_2
- 使用melt()方法
tmp_df6_3=tmp_df6_1.melt(id_vars=["citylevel","star","orderdate","type"],var_name='datatype',value_name='data')
#参数id_vars为保持不变的列;
#var_name为转换为行的列的列名;
#value_name为新产生的列的列名
tmp_df6_3
两种方法的结果默认排序方式不一样,stack方法按行,melt方法按列
长表转换为宽表
对应excel的数据透视表,在10.2节讲解
apply()与applymap()函数
df6["momrate"].apply(lambda x:x*100)
#与匿名函数lambda结合使用
#对momrate这一列每个元素都*100
#指定行数据操作类似df6.applymap(lambda x:x*100)
#与匿名函数lambda结合使用
#对df6表中每个元素都*100
第8章 数据运算
算术运算
#加减乘除
round((df6["num"]-df6["num_lastM"])/df6["num_lastM"]*1,4)
#可以在外层+round() 非科学计数法显示
比较运算
#比较判断 < > !=
df6["num"]>df6["num_lastM"]#返回对应位置的True False
汇总运算
#非空值计数
df6.count()#计算每一列非空单元格的数量
df6.count(axis=1)#计算每一行非空单元格的数量
df6['num'].sum()#sum求和,同样地,借助参数axis=1可以控制对行运算(下同)
df6['num'].mean()#平均值
df6['num'].max()#最大值
df6.iloc[0:2,].max(axis=1)#对前两行求最大值
df6['num'].min()#最小值
df6.iloc[0:2,].min()#在前两行范围内,对每一列求最小值
df6.iloc[0:2,].min(axis=1)#axis=1,前两行的数据中,对每行求最小值
df6['num'].median() #中位数
df6[['num','num_lastM','num_lastY']].mode() #众数
df6[['num','num_lastM','num_lastY']].var()#方差
df6[['num','num_lastM','num_lastY']].std()#标准差
df6[['num','num_lastM','num_lastY']].quantile(0.25)#1/4分位数
df6[['num','num_lastM','num_lastY']].quantile(0.75)#3/4分位数
df6[['num','num_lastM','num_lastY']].quantile(0.6)
#相关性运算--一般使用的是皮尔逊相关系数
df6['num'].corr(df6['num_lastM'])#指定两列之间的相关系数
df6[['num','num_lastM','num_lastY']].corr()#多列之间两两相关的相关系数
df6[['num','num_lastM','star']].corr()#结果只有'num','num_lastM'两个字段的相关系数,其中star不是数值型
第9章 时间序列
获取当前时刻的时间
#获取当前时刻的日期
datetime.now()
datetime.now().year#年
datetime.now().month#月
datetime.now().day#日
datetime.now().hour
datetime.now().minute
datetime.now().second
#获取周数
datetime.now().weekday() #一周中的第几天
datetime.now().weekday()+1#系统记录周天是每周的第一天,故+1处理
datetime.now().isocalendar()#一年中的第几周、以及当周的第几天(已作+1处理,但还是从周日开始算新的一周,注意区分)
datetime.now().isocalendar()[0]#当前日期所在年份
datetime.now().isocalendar()[1]#当前日期所在周数
datetime.now().isocalendar()[2]#当前日期所在周的第几天
指定日期和时间的格式
#时间格式
datetime.now()
datetime.now().date()#当前时间展示到日期维度
datetime.now().time()#当前时间只展示时间
#借助strftime()自定义时间和日期格式
datetime.now().strftime('%Y-%m-%d')
datetime.now().strftime('%F')#'%Y-%m-%d'的简写形式
datetime.now().strftime('%Y/%m/%d')
datetime.now().strftime('%Y-%m-%d %H:%M:%S')
datetime.now().strftime('%Y-%m-%d %I:%M:%S')#%I表示12小时制
datetime.now().strftime('%Y-%h-%d %H:%M:%S')
datetime.now().strftime('%Y-%m-%d %W %H:%M:%S')#%W为周数,周一为新的一周
datetime.now().strftime('%Y-%m-%d %U %H:%M:%S')#%U为周数,周日为新的一周
datetime.now().strftime('%Y-%m-%d %W %w %H:%M:%S')#%W为周数,周一为新的一周;%w为周几,从0开始(0对应周日,1对应周一)
字符串和时间格式的相互转换
#字符串与时间格式的转换
type('2020-09-28')#得到结果是str
from dateutil.parser import parse
type(parse('2020-09-28')) #得到结果是datetime.datetime
时间索引
- 当日期为索引列时
- 当日期是普通列时
借助布尔索引实现时间的选取,注意字段格式为str
时要转换为timestamp
df6[df6["orderdate"]>="2020-09"]
df6[df6["orderdate"]>datetime(2020,1,1)]
#若提示orderdate为str格式,需要先进行格式转换
#法一 用pandas的to_datetime()方法
tmp_df6=df6
tmp_df6["orderdate"]=pd.to_datetime(df6["orderdate"])
tmp_df6[tmp_df6["orderdate"]>datetime(2020,1,1)]
#法二 用apply()方法
tmp_df6_02=df6
tmp_df6_02["orderdate"]=tmp_df6_02["orderdate"].apply(lambda x:datetime.strptime(x,'%Y-%m-%d %H:%M:%S'))
tmp_df6_02[tmp_df6_02["orderdate"]>="2020-09"]
时间运算
- 时间差
sub_c=datetime.now()-parse('2020-09-21') sub_c #返回一个timedelta对象,差值为7天36127秒
返回的结果为:datetime.timedelta(days=7, seconds=36127, microseconds=944638)
表示返回一个timedelta对象,差值为7天36127秒
timedelta对象包含天、秒、微秒三个等级,可以直接获取;获取小时、分钟则需换算sub_c.days sub_c.seconds sub_c.seconds/3600 #换算为小时 sub_c.seconds/60 #换算为分钟
- 时间偏移
#时间偏移
##法一 timedelta方法
from datetime import timedelta
date=datetime(2019,10,17,9,17)
date+timedelta(days=100) # 往后推移100天
date-timedelta(seconds=3600*12) #往前推移12小时#法二 date offset方法
from pandas.tseries.offsets import Day,Hour,Minute
date+Day(365)
date+Hour(3000)
date-Minute(3000)
第10章 数据分组/数据透视表
数据分组
#分组键是列名
df6.groupby("citylevel").count()
tmp_df=df6[(df6["type"]=="产量")&(df6["orderdate"]>="2020-01")].groupby(["citylevel","star"])[["num","num_lastM","num_lastY"]].sum()
#汇总求和2020年按照城市等级、酒店星级的当月产量、上月产量、去年同期产量
#groupby(["citylevel","star"])按多个字段分组
#[["num","num_lastM","num_lastY"]]对指定列进行汇总
#.count() .sum()选择运算方法
tmp_df["mom"]=tmp_df["num"]/tmp_df["num_lastM"]-1 #该数据无实际含义
tmp_df["yoy"]=tmp_df["num"]/tmp_df["num_lastY"]-1 # 2020年1-8月产量的同比增长率
tmp_df#查看数据
#分组键是series
#与分组键为列名的区别在于 groupby中传入的内容的具体形式不同 ,其余都一样
df6.groupby(df6["citylevel"]).count()
tmp_df=df6[(df6["type"]=="产量")&(df6["orderdate"]>="2020-01")].groupby([df6["citylevel"],df6["star"]])[["num","num_lastM","num_lastY"]].sum()
tmp_df["yoy"]=tmp_df["num"]/tmp_df["num_lastY"]-1 # 2020年1-8月产量的同比增长率
tmp_df#查看数据
- aggregate方法
aggregate方法可以一次使用多种汇总方法;
可以针对不同的列做不同的汇总运算
#aggregate方法
df6.groupby(df6["citylevel"]).aggregate(["count","sum"])
df6.groupby(df6["citylevel"]).aggregate({"star":"count","num":"sum","num_lastM":"sum","num_lastY":"sum","momrate":"mean"})
- 重置索引
#重置索引(将分组字段citylevel、star转换为非索引列
df6.groupby([df6["citylevel"],df6["star"]]).aggregate({"type":"count","num":"sum","num_lastM":"sum","num_lastY":"sum","momrate":"mean"}).reset_index()
数据透视表
#基本表达即所有参数如下
pd.pivot_table(df,values=None,index=None,columns=None,aggfunc='mean',fill_value=None,margins=False,dropna=True,margins_name='ALL')
#values表示计算的值
#index表示行
#columns表示列
#aggfunc表示运算方法
#fill_value表示对空值的值进行填充
#margins表示是否显示合计列
#dropna表示是否删除缺失值
#margins_name表示合计列的列名
#练习如下
pd.pivot_table(df6[(df6["orderdate"]>="2020-01")&(df6["type"]=="产量")],values=['type','num'],index='orderdate',columns='citylevel',aggfunc={'type':'count','num':'sum'},fill_value=0,margins=True,dropna=False,margins_name='ALL').reset_index()
#df6[(df6["orderdate"]>="2020-01")&(df6["type"]=="产量")]设置了过滤条件
#values=['type','num']可以对多个字段进行汇总
#aggfunc={'type':'count','num':'sum'}通过字典设置不同字段不同汇总方式
#fill_value=0缺失值填充为0
#.reset_index()重置索引
第11章 多表拼接
横向拼接
#//简单的横向拼接
pd.merge(df8,df7,on="orderid",how='inner')
#case
#//对df8和tmp_df7先进行分组与汇总
tmp_result7=tmp_df7.groupby([tmp_df7["type"],tmp_df7["etd"],tmp_df7["country"]]).aggregate({"orderid":"count","ciiquantity":"sum","ciireceivable":"sum"}).reset_index()
tmp_result8=df8.groupby([df8["type"],df8["etd"],df8["region"]]).aggregate({"orderid":"count","ciiquantity":"sum","ciireceivable":"sum"}).reset_index()
#//新建一列id:由type etd region组成的匹配id
tmp_result7["id"]=tmp_result7["type"]+tmp_result7["etd"]+tmp_result7["country"]
tmp_result8["id_no"]=tmp_result8["type"]+tmp_result8["etd"]+tmp_result8["region"]
#//使用merge()方法进行横向拼接
pd.merge(tmp_result8,tmp_result7,left_on="id_no",right_on='id',how='left',suffixes=["_F","_N"])
#参数说明: left_on right_on on 为连接键
## how指定连接方式,默认为 inner,可指定 left right outer
## suffixes自定义重复列名,默认为 ["_x","_y"]
纵向拼接
concat()方法
#case
#step1 添加区分列、修改保持列名一致
tmp_result7['source']="national"
tmp_result7=tmp_result7.rename(columns={"country":"region"})
tmp_result8['source']="finance"
tmp_result8=tmp_result8.rename(columns={"id_no":"id"})
#普通合并
pd.concat([tmp_result7,tmp_result8])
#设置concat参数
pd.concat([tmp_result7,tmp_result8],ignore_index=True).drop_duplicates()
#参数ignore_index重置索引,默认值是False
#drop_duplicates()删除重复项
第12章 结果导出
导出为.xlsx文件
#to_exel 方法
#基本表达
df6_result1.to_excel(excel_writer=r"D:\Users\Desktop\data\output\outputtest_df6pivot.xlsx",sheet_name='df6pivot')
#参数设置
df8_result1=df8.groupby([df8["type"],df8["orderstatus"],df8["etd"],df8["region"]]).aggregate({"orderid":"count","ciiquantity":"sum","ciireceivable":"sum"}).reset_index()
df8_result1.to_excel(excel_writer=r"D:\Users\Desktop\data\output\outputtest_df8.xlsx",sheet_name='df8',index=False, #不导出index;上述df6则是因为数据透视表设置了index为orderdate#columns=["type","etd","orderid"] 限定导出的列encoding="utf-8", #一般都选择utf-8na_rep=0, #缺失值填充为0inf_rep=0 #无穷值填充为0)
导出为.csv文件
excel中csv有两种形式:
CSV UTF-8(逗号分隔)(.csv) 编码格式为utf-8
CSV(逗号分隔)(.csv) 编码格式为gbk
df6_result1.to_csv(path_or_buf=r"D:\Users\yl.zhong\Desktop\data\output\outputtest_df6pivot.csv",#index,columns这两个参数同上xlsxsep=',' #sep参数用来指定分隔符号,默认为逗号分隔,na_rep=0 #设置缺失值,encoding='utf-8-sig' #默认涉及utf-8的编码,可能会出现中文乱码,则使用utf-8-sig或者gbk)#csv没有sheet_name这个参数,不能设置sheet名
多个sheet
#声明一个读写对象
writer=pd.ExcelWriter(r"D:\Users\yl.zhong\Desktop\data\output\sheets.xlsx",engine='xlsxwriter')
#将df6_result1、df8_result1写入到“sheets”中的两个sheet,并命名
df6_result1.to_excel(writer,sheet_name='df6pivot')
df8_result1.to_excel(writer,sheet_name='df8',index=False, #不导出index;上述df6则是因为数据透视表设置了index为orderdate#columns=["type","etd","orderid"] 限定导出的列encoding="utf-8", #一般都选择utf-8na_rep=0, #缺失值填充为0inf_rep=0 #无穷值填充为0)
#保存读写的内容
writer.save()
第13章 数据可视化
第14章 案例分析
第15章 numpy数组
《对比excel,轻松学习python数据分析》学习笔记相关推荐
- 第二行代码学习笔记——第六章:数据储存全方案——详解持久化技术
本章要点 任何一个应用程序,总是不停的和数据打交道. 瞬时数据:指储存在内存当中,有可能因为程序关闭或其他原因导致内存被回收而丢失的数据. 数据持久化技术,为了解决关键性数据的丢失. 6.1 持久化技 ...
- 第一行代码学习笔记第二章——探究活动
知识点目录 2.1 活动是什么 2.2 活动的基本用法 2.2.1 手动创建活动 2.2.2 创建和加载布局 2.2.3 在AndroidManifest文件中注册 2.2.4 在活动中使用Toast ...
- 第一行代码学习笔记第八章——运用手机多媒体
知识点目录 8.1 将程序运行到手机上 8.2 使用通知 * 8.2.1 通知的基本使用 * 8.2.2 通知的进阶技巧 * 8.2.3 通知的高级功能 8.3 调用摄像头和相册 * 8.3.1 调用 ...
- 第一行代码学习笔记第六章——详解持久化技术
知识点目录 6.1 持久化技术简介 6.2 文件存储 * 6.2.1 将数据存储到文件中 * 6.2.2 从文件中读取数据 6.3 SharedPreferences存储 * 6.3.1 将数据存储到 ...
- 第一行代码学习笔记第三章——UI开发的点点滴滴
知识点目录 3.1 如何编写程序界面 3.2 常用控件的使用方法 * 3.2.1 TextView * 3.2.2 Button * 3.2.3 EditText * 3.2.4 ImageView ...
- 第一行代码学习笔记第十章——探究服务
知识点目录 10.1 服务是什么 10.2 Android多线程编程 * 10.2.1 线程的基本用法 * 10.2.2 在子线程中更新UI * 10.2.3 解析异步消息处理机制 * 10.2.4 ...
- 第一行代码学习笔记第七章——探究内容提供器
知识点目录 7.1 内容提供器简介 7.2 运行权限 * 7.2.1 Android权限机制详解 * 7.2.2 在程序运行时申请权限 7.3 访问其他程序中的数据 * 7.3.1 ContentRe ...
- 第一行代码学习笔记第五章——详解广播机制
知识点目录 5.1 广播机制 5.2 接收系统广播 * 5.2.1 动态注册监听网络变化 * 5.2.2 静态注册实现开机广播 5.3 发送自定义广播 * 5.3.1 发送标准广播 * 5.3.2 发 ...
- 第一行代码学习笔记第九章——使用网络技术
知识点目录 9.1 WebView的用法 9.2 使用HTTP协议访问网络 * 9.2.1 使用HttpURLConnection * 9.2.2 使用OkHttp 9.3 解析XML格式数据 * 9 ...
- 安卓教程----第一行代码学习笔记
安卓概述 系统架构 Linux内核层,还包括各种底层驱动,如相机驱动.电源驱动等 系统运行库层,包含一些c/c++的库,如浏览器内核webkit.SQLlite.3D绘图openGL.用于java运行 ...
最新文章
- 【烦人的问题】有一天发现VSCode中自己的鼠标选择老是跨行选择多段代码,怎么都改不回来,而且用alt+shift+鼠标都无法切换,肿么办?
- eclipse可以写前端吗_Python 竟然也可以写网页前端了!
- iOS 新特性分列式 之 iOS 8.x - 主要内容:应用扩展、手动对焦、Size Class
- 初看jQuery,比较dojo与jQuery的不同点
- redis主从架构宕机问题手动解决
- SAP UI5 GM6 require sap.ui.core.Core
- 分布式部署携程Apollo构建配置中心
- TimeSpan 用法 求离最近发表时间的函数
- 关于Android学习要问的一些问题
- UVA10800 Not That Kind of Graph【模拟+绘图】
- VS code 连接Linux服务器
- pb模型文件与.pbtxt配置不匹配导致OpenCV调用dnn模块出错(Mask R-CNN为例)
- 模仿开发H5游戏,看你有多色
- 《Miss Talk》第04期:对话凯叔讲故事 曲艳颂
- Android实时监听短信并上传服务器
- QT实现弹幕和webp格式礼物动效
- 插上耳机没声音 程序包ID:Audioplaybackdiagnostic 错误代码:0x80070002 源:引擎 上下文:升级
- 会员权益营销如何助力会员指数增长
- MATLAB--基本操作与矩阵输入
- 【免费资源必备】LingoDeer,扫描全能王直装版等五款APP让你享受上千个免费资源
热门文章
- 股票连续跌停后开板表现
- 括号匹配openjudge c语言,OpenJudge计算概论-扩号匹配问题【这个用到了栈的思想】...
- ubuntu端opencv人脸检测,并实现自动拍照,录视频
- chrome 主页被劫持,每天首次打开chrome都会进入2345的界面
- g++ 编译hook文件命令
- OpenOffice前途惨淡,我们还有其它选择吗?
- 从word2vec到bert:NLP预训练模型发展史
- 对电化学稳态阻抗谱(EIS)的数据进行自动化处理并可视化作图/画图(科研投稿)
- Qt开发之路——整型与字符串 int与QString互转
- 给大家介绍一个方便,好用的网络收藏夹