文章目录

  • 3.7 数据清洗
    • 3.7.1 查看与处理缺失值
      • 3.7.1.1 查看缺失值
      • 3.7.1.2缺失值删除处理
      • 3.7.1.3 缺失值填充处理
    • 3.7.2重复值处理
    • 3.7.3 异常值的检测与处理
  • 3.8索引设置
    • 3.8.1索引的作用
    • 3.8.2重新设置索引
      • 3.8.2.1 对Series对象重新设置索引
      • 3.8.2.2 对DataFrame对象重新设置索引
    • 3.8.3设置某列为索引
  • 4.1 数学计算
  • 4.2数据的格式化
  • 4.3数组分组统计
  • 4.4数据移动
  • 4.5 数据转换
    • 一列数据转换为多列数据
    • 行列转换
    • DataFrame转为字典
    • DataFrame转列表
    • 转元组
    • 转html
  • 4.6数据合并
    • 数据合并(merge)
      • 合并去重
      • 多对一数据合并
      • 多对多数据合并
    • 数据合并(使用Cancat方法)
      • 形同字段首尾相接
      • 横向表合并(行对齐)
      • 交叉合并
  • 4.7数据导出
    • 导出为.xlsx文件
    • 导出为.csv文件
    • 导出多个sheet页中
  • 4.8 日期数据处理
    • DataFrame的日期数据转换
    • dt对象使用
    • 获取日期、金额的区间数据
    • 按照不同时期统计并显示数据
    • 按照时区统计并显示数据
  • 时间序列
    • 重采样(Resample)
    • 降采样抽取
    • 升采样处理
    • 时间序列数据汇总(Ohlc函数)
    • 移动窗口数据计算

python

3.7 数据清洗

3.7.1 查看与处理缺失值

缺失值指的是由于某种原因导致数据为空,这种情况一般有四种处理方式: 一 是不处理:二是

3.7.1.1 查看缺失值

import pandas as pd
#设置数据显示的列数和宽度
pd.set_option('display.max_columns',500)
pd.set_option('display.width',1000)
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df=pd.read_excel('TB2018.xls')
print(df)
print(df.info())

结果:

  买家会员名  买家实际支付金额  宝贝总数量                     宝贝标题   类别        订单付款时间
0      mr001            143.50         2.0                Python黄金组合  图书 2018-10-09 22:54:26
1      mr002             78.80         1.0                Python编程锦囊   NaN 2018-10-09 22:52:42
2      mr003             48.86         1.0                 零基础学C语言  图书 2018-01-19 12:53:01
3      mr004             81.75         NaN  SQL Server应用与开发范例宝典  图书 2018-06-30 11:46:14
4      mr005            299.00         1.0          Python程序开发资源库   NaN 2018-03-23 18:25:45
5      mr006             41.86         1.0                零基础学Python  图书 2018-03-24 19:25:45
6      mr007             55.86         1.0            C语言精彩编程200例  图书 2018-03-25 11:00:45
7      mr008             41.86         NaN         C语言项目开发实战入门  图书 2018-03-26 23:11:11
8      mr009             41.86         1.0          Java项目开发实战入门  图书 2018-03-27 07:25:30
9      mr010             34.86         1.0                   SQL即查即用  图书 2018-03-28 18:09:12
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10 entries, 0 to 9
Data columns (total 6 columns):#   Column    Non-Null Count  Dtype
---  ------    --------------  -----         0   买家会员名     10 non-null     object        1   买家实际支付金额  10 non-null     float64       2   宝贝总数量     8 non-null      float64       3   宝贝标题      10 non-null     object        4   类别        8 non-null      object        5   订单付款时间    10 non-null     datetime64[ns]

在Pyhon中,缺失值一 般以 NaN表示,如图所示,通过 info方法可以看到“家会员名”“买家实际支付金额”“宝贝标题”和“订单付款时间”的非空数量是10,而“宝贝总数量”和“类别”的非空数量是8, 则说明这两项存在空值。

现在判断数据是否存在缺失值,还可以使用isnull方法和notnull方法,

import pandas as pd
#设置数据显示的列数和宽度
pd.set_option('display.max_columns',500)
pd.set_option('display.width',1000)
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df=pd.read_excel('TB2018.xls')
print(df.isnull())
print(df.notnull())
0        True              True        True       True   True          True
1        True              True        True       True  False          True
2        True              True        True       True   True          True
3        True              True       False       True   True          True
4        True              True        True       True  False          True
5        True              True        True       True   True          True
6        True              True        True       True   True          True
7        True              True       False       True   True          True
8        True              True        True       True   True          True
9        True              True        True       True   True          True

使用isnull 方法,缺失值返回True:非缺失值返回False ;而notull方法与isnul方法正好相反,即缺失值返回False ;非缺失值返回True。
如果使用“df[df.isnull= False]”语句,则会将所有不是缺失值的数据找出来,但是只针对Seris对象。

3.7.1.2缺失值删除处理

通过前面的判断得知了数据缺失情况,下面将缺失值删除,主要使用dropna方法,该方法用于删除含有缺失值的行,关键代码如下:

df.dropna()
import pandas as pd
#设置数据显示的列数和宽度
pd.set_option('display.max_columns',500)
pd.set_option('display.width',1000)
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df=pd.read_excel('TB2018.xls')
print(df.dropna())

从运行结果得知: dropna方法将所有包含缺失值的数据全部删除了。那么,此时如果认为有些数据虽然存在缺失值,但是不影响数据分析,那么可以使用以下方法进行处理。例如,在上述数据中只保留“宝贝总数量”中不存在缺失值的数据,而类别是否缺失无所谓,则可以使用notnull方法判断,关键代码如下:

import pandas as pd
#设置数据显示的列数和宽度
pd.set_option('display.max_columns',500)
pd.set_option('display.width',1000)
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df=pd.read_excel('TB2018.xls')
df1=df[df["宝贝总数量"].notnull()]
print(df1)

3.7.1.3 缺失值填充处理

对于缺失数据,如果比例高于30%,则可以选择放弃这个指标,进行删除处理:低于30%时,尽量不要删除,而是选择将这部分数据填充,一般以0、均值、众数称非决失值去填充该缺失值: DataFrame中的fillna函数可以实现填充缺失数据,pad/ffill函数表示用前一bfill 函数表示用下个非缺失值填充该缺失值: None用于指定一 个值去管换缺失值。

import pandas as pd
#设置数据显示的列数和宽度
pd.set_option('display.max_columns',500)
pd.set_option('display.width',1000)
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df=pd.read_excel('TB2018.xls')
df["宝贝总数量"]=df["宝贝总数量"].fillna(0)
print(df)

补充后的值

3      mr004             81.75         0.0  SQL Server应用与开发范例宝典  图书 2018-06-30 11:46:14

3.7.2重复值处理

对于数据中存在的重复数据,包括重复的行或者某几行中某几列的值重复,一般做删除处理,要使用DataFrame对象中的drop_duplicates 方法。

属性方法 使用
df.duplicated() 判断每一行数据是否重复(全部相同),False表示不重复,返回值为True表示重复
df.drop_duplicates() 除全部的重复数据
df.drop_duplicates([‘买家会员名’]) 去除指定列的重复数据
df.drop_duplicates([‘买家会员名’],keep=‘last’) 保留重复行中的最后一行
df.drop_duplicates([‘买家会员名’,‘买家支付宝账号’],inplace=False) inplace=True表示直接在原来的DataFrame上删除重复项,而默认值False表示生成一个副本。
import pandas as pd
aa =r'1月_s.xlsx'
df = pd.DataFrame(pd.read_excel(aa))#判断每一行数据是否重复(全部相同),False表示不重复,返回值为True表示重复
print(df.duplicated())
#去除全部的重复数据
print(df.drop_duplicates())
#去除指定列的重复数据
print(df.drop_duplicates(['买家会员名']))
#保留重复行中的最后一行
print(df.drop_duplicates(['买家会员名'],keep='last'))
#inplace=True表示直接在原来的DataFrame上删除重复项,而默认值False表示生成一个副本。
print(df.drop_duplicates(['买家会员名','买家支付宝账号'],inplace=False))

3.7.3 异常值的检测与处理

首先了解一下什么是异常值。 在数据分析中,异常值是指超出或低于正常范围的值,如年龄大于200、身高大于3米、宝贝总数量为负数等类似数据。那么这些数据如何检测呢?主要有以下几种方法:

  • 根据给定的数据范围进行判断,不在范围 内的数据视为异常值。
  • 必均方差。
    在统计学中,如果一个数据分布近似正态分布( 数据分布的一种形式,呈钟型,两头低,中间高,左右对称,因其曲线呈钟形),那么大约68%的数据值都会在均值的一个标准差范围内,大约95%的数据值会在两个标准差范围内,大约99.7%的数据值会在三个标准差范围内。
  • 箱形图。
    箱形图是显示一组数据分散情况资料的统计图。它可以将数据通过四分位数的形式进行图形化述,箱形图通过上限和下限作为数据分布的边界。任何高于上限或低于下限的数据都可以认为是异值。

了解异常值的检测后,接下来介绍如何处理异常值,主要包括以下几种处理方式:
(1)最常用的方式是删除。
(2)将异常值当缺失值处理,以某个值填充。
(3)将异常值当特殊情况进行分析,研究异常值出现的原因。

3.8索引设置

索引能够快速查询数据,本节主要介绍索引的作用以及应用。

3.8.1索引的作用

索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。Pandas索引的作用如下:

  • 更方便地查询数据。
  • 使用索引可以提升查询性能。
  • 如果索引是唯一的,Pandas会使用哈希表优化,查找数据的时间复杂度为O(1)。
  • 如果索引不是唯一的,但是有序,Pandas会使用二分查找算法,查找数据的时间复杂度为0(logN)。
  • 如果索引是完全随机的,那么每次查询都要扫描数据表, 查找数据的时间复杂度为0(N)。利用索引实现自动的数据对齐功能
import pandas as pd
s1= pd.Series([10,20,30],index=list('abc'))
s2= pd.Series([2,3,4],index=list('bcd'))
print(s1+s2)
  • 强大的数据结构。

  • 基于分类数的索引,提升性能。

  • 多维索引,用子groupby多维聚合结果等。

  • 时间类型索引,强大的日期和时间的方法支持

3.8.2重新设置索引

Pandas有一个很重要的方法是reindex,它的作用是创建一个适应新索引的新对象。语法如下:

DataFrame.reindex(1abels=None,index=None,columns = None,axis = None ,method = None, copy =True,level = None,fill_value=nan,limit = None,tolerance = None)

常用参数说明:

  • labels: 标签,可以是数组,默认值为None.
  • index: 行索引,默认值为None.
  • columns: 列索引,默认值为None.
  • axis: 轴,0表示行: 1表示列,默认值为None.
  • method: 默认值为None, 重新设置索引时,选择插值(用来填充缺失数据)方法,其值可以是None、bill/backill (向后填充)、ffill/pad (向前填充)等。
  • fill_ value: 缺失值要填充的数据。如缺失值不用NaN填充,用0填充,则设置“fill _value=0"即可。

3.8.2.1 对Series对象重新设置索引

from pandas import Series
#从pandas引入Series对象,就可以直接使用Series对象了,如Series([88,60,75],index=[1,2,3])
s1=Series([60,70,80],index=[1,2,3])
print(s1)
print(s1.reindex([1,2,3,4,5]))print(s1.reindex([1,2,3,4,5],method='ffill'))   #向前填充
print(s1.reindex([1,2,3,4,5],method='bfill'))

3.8.2.2 对DataFrame对象重新设置索引

对于DataFame对象,reindex 方法用于修改行索引和列索引。

import pandas as pd
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
data = [[110,105,99],[105,88,115],[109,120,130]]
index=['mr001','mr003','mr005']
columns = ['语文','数学','英语']
df = pd.DataFrame(data=data, index=index,columns=columns)
print(df)#通过reindex()方法重新设置行索引、列索引和行列索引
print(df.reindex(['mr001','mr002','mr003','mr004','mr005']))
print(df.reindex(columns=['语文','物理','数学','英语']))
print(df.reindex(index=['mr001','mr002','mr003','mr004','mr005'],columns=['语文','物理','数学','英语']))

3.8.3设置某列为索引

设置某列为行索引主要使用set_index 方法。
如果在set_index 方法中传入参数“drop=True",则会删除“买家会员名”:如果传入“drop=False",则会保留“买家会员名”,默认为False。

import pandas as pd
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df=pd.read_excel('1月.xlsx')
print(df.head())#设置“买家会员名”为行索引
df=df.set_index(['买家会员名'],drop=False)
print(df.head())

3.8.4数据清洗后重新设置连续的行索引

import pandas as pd
#设置数据显示的列数和宽度
pd.set_option('display.max_columns',500)
pd.set_option('display.width',1000)
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df=pd.read_excel('TB2018.xls')
#df.dropna() 后序号是不连续的
#使用reset_index,删除行列中NaN的值,并重新调整
df=df.dropna().reset_index(drop=True)
print(df)

4.1 数学计算

import pasndas as pdpd.set_option("display.unicode.east_asian_width",True)
data=[[110,105,99],[105,88,115],[109,120,130]]
index=[1,2,3]
columns=['语文',"数学",'英语']
df=pd.DataFrame(data=data,index=index,columns=columns)
###求和sum函数   axis=1按列相加  axis=0 按行相加
###skipna=1  NaN自动化转换为0
df["总成绩"]=df.sum(axis=1,skipna=1)
print(df)###求平均值mean函数
new=df.mean()
df=df.append(new,ignore_index=True)
print(df)###最大值max()
new=df.max()
df=df.append(new,ignore_index=True)
print(df)##最小值min()
new=df.min()
df=df.append(new,ignore_index=True)
print(df)
###中位数median
data=[[111,105,99],[120,88,120],[111,113,99]]
index=[1,2,3]
df1=pd.DataFrame(data=data,columns=columns)
print(df1)
print(df1.median())print("###############众数信息如下")
##成绩的众数
print(df1.mode())
##每一行的众数
print(df1.mode(axis=1))
##“数学”的众数
print(df1["数学"].mode())print("###############方差")
print("var函数")
print(df1.var(axis=1))print("###############标准差")
print("std函数")
print(df1.std())print("###############分位数")
print("quantitle函数")
#计算35%的分位数
x=df1['数学'].quantile(0.35)
#输出淘汰学生
print(df[df['数学']<=x])

4.2数据的格式化

import pandas as pd
import numpy as np
##数据格式化
###设置小数位数
df=pd.DataFrame(np.random.random([5,5]),columns=['A1','A2','A3','A4','A5'])
print(df)
print(df.round(2))  #保留两位小数
print(df.round({'A1':1,'A2':2})) #A1列保留1位,A2列保留两位s1=pd.Series([1,0,2],index=['A1','A2','A3']) #设置Series对象的小数位数
print(df.round(s1))###设置百分比
df1=pd.DataFrame(np.random.random([5,5]),columns=['A1','A2','A3','A4','A5'])df1['百分比']=df1['A1'].apply(lambda x:format(x,'.0%'))
print(df1)
df1['百分比']=df1['A1'].apply(lambda x:format(x,'.2%'))
print(df1)
df1['百分比']=df1['A1'].map(lambda x:'{:.0}'.format(x))  #使用map函数保留0位小数
print(df1)
#设置千位分割符
import pandas as pd
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
data = [['零基础学Python','1月',49768889],['零基础学Python','2月',11777775],['零基础学Python','3月',13799990]]
columns = ['图书','月份','码洋']
df = pd.DataFrame(data=data, columns=columns)
df['码洋']=df['码洋'].apply(lambda x:format(int(x),','))   #码洋的列进行设置千位分割符
print(df)

4.3数组分组统计

#分组统计groupby函数
####一列分组统计
import pandas as pd  #导入pandas模块
#设置数据显示的列数和宽度
pd.set_option('display.max_columns',500)
pd.set_option('display.width',1000)
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df=pd.read_csv('JD.csv',encoding='gbk')
#抽取数据
df1=df[['一级分类','7天点击量','订单预定']]
print(df1.groupby('一级分类').sum())#分组统计求和####按照多列分组统计
df2=df[['一级分类','二级分类','7天点击量','订单预定']]
print(df2.groupby(['一级分类','二级分类']).sum())#分组统计求和#####分组并指定列激进型数据计算
print(df2.groupby('二级分类')['7天点击量'].sum())#分组统计求和
#对分组数据进行迭代
#####迭代“一级分类”
import pandas as pd  #导入pandas模块
#设置数据显示的列数和宽度
pd.set_option('display.max_columns',500)
pd.set_option('display.width',1000)
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df=pd.read_csv('JD.csv',encoding='gbk')
#抽取数据
df1=df[['一级分类','7天点击量','订单预定']]
for name,group in df1.groupby('一级分类'):print(name)print(group)#####迭代“两级分类”
#抽取数据
df1=df[['一级分类','二级分类','7天点击量','订单预定']]
for name,group in df1.groupby(['一级分类','二级分类']):print(name)print(group)
#对分组的某列或多列使用聚合函数(agg函数)
####对分组统计结果使用聚合函数
import pandas as pd  #导入pandas模块
#设置数据显示的列数和宽度
pd.set_option('display.max_columns',500)
pd.set_option('display.width',1000)
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df=pd.read_csv('JD.csv',encoding='gbk')
#抽取数据
df1=df[['一级分类','7天点击量','订单预定']]print(df1.groupby("一级分类").agg(['mean', 'sum']))####针对不同的列使用不同的聚合函数
print(df1.groupby("一级分类").agg({"7天点击量":['mean','sum'],'订单预定':['sum']}))
####通过自定义函数实现分组统计
import pandas as pd  #导入pandas模块
#设置数据显示的列数和宽度
pd.set_option('display.max_columns',500)
pd.set_option('display.width',1000)
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df=pd.read_excel('1月.xlsx')  #导入Excel文件
#x是“宝贝标题”对应的列
#value_counts()函数用于Series对象中的每个值进行计数并且排序
max1 = lambda x: x.value_counts(dropna=False).index[0]
max1.__name__ = "购买次数最多"
df1=df.agg({'宝贝标题': [max1],'数量': ['sum', 'mean'],'买家实际支付金额': ['sum', 'mean']})
print(df1)
#通过字典和Series对象进行分组统计
import pandas as pd  #导入pandas模块
#设置数据显示的列数和宽度
pd.set_option('display.max_columns',500)
pd.set_option('display.width',1000)
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df=pd.read_csv('JD_1.csv',encoding='gbk')  #导入csv文件
df=df.set_index(['商品名称'])
#创建字典
dict1={'上海出库销量':'北上广','北京出库销量':'北上广','广州出库销量':'北上广','成都出库销量':'成都','武汉出库销量':'武汉','西安出库销量':'西安'}
df1=df.groupby(dict1,axis=1).sum()
print(df1)
#通过Series对象进行分组统计
import pandas as pd  #导入pandas模块
#设置数据显示的列数和宽度
pd.set_option('display.max_columns',500)
pd.set_option('display.width',1000)
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df=pd.read_csv('JD_1.csv',encoding='gbk')  #导入csv文件
df=df.set_index(['商品名称'])
#data数据
data={'上海出库销量':'北上广','北京出库销量':'北上广','广州出库销量':'北上广','成都出库销量':'成都','武汉出库销量':'武汉','西安出库销量':'西安',}
s1=pd.Series(data)
print(s1)
df1=df.groupby(s1,axis=1).sum()
print(df1)

4.4数据移动

#周测成绩的升降情况
import pandas as pd
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
data = [110,105,99,120,115]
index=[1,2,3,4,5]
df = pd.DataFrame(data=data,index=index,columns=['英语'])df['升降']=df['英语']-df['英语'].shift()
print(df)

4.5 数据转换

一列数据转换为多列数据

import pandas as pd
#设置数据显示的列数和宽度
pd.set_option('display.max_columns',500)
pd.set_option('display.width',1000)
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
#导入Excel文件指定列数据(“买家会员名”和“收货地址”)
df = pd.read_excel('mrbooks.xls',usecols=['买家会员名','收货地址'])
#使用split方法分割“收货地址”
series=df['收货地址'].str.split(' ',expand=True)
df['省']=series[0]
df['市']=series[1]
df['区']=series[2]
print(df.head())#逗号‘,’分割多种商品数据
df = pd.read_excel('mrbooks.xls',usecols=['买家会员名','宝贝标题','收货地址'])
df=df.join(df['宝贝标题'].str.split(',',expand=True))
print(df)#对元组数据进行分割
import pandas as pd
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df = pd.DataFrame({'a':[1,2,3,4,5], 'b':[(1,2), (3,4),(5,6),(7,8),(9,10)]})
print(df.head())
df[['b1', 'b2']] = df['b'].apply(pd.Series)
#或者
df= df.join(df['b'].apply(pd.Series))
print(df)

行列转换

import pandas as pd
#设置数据显示的列数和宽度
pd.set_option('display.max_columns',500)
pd.set_option('display.width',1000)
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df=pd.read_excel('grade.xls')      #导入Excel文件
df = df.set_index(['班级','序号']) #设置2级索引“班级”和“序号”
##stack原来的索引转换成内层的行索引
df = df.stack()
print(df)
##unstack将内层的行索引转成列索引
df=pd.read_excel('grade.xls',sheet_name='英语2')
df=df.set_index(['班级','序号','Unnamed: 2'])  #设置多级索引
print(df.unstack())
##piovt方法  指定某列的值做为行索引,指定某列的值做为列索引
df=pd.read_excel('grade.xls',sheet_name='英语3')
print(df.pivot(index='序号',columns='班级',values='得分'))

DataFrame转为字典

import pandas as pd
df = pd.read_excel('mrbooks.xls')
#groupby分组统计
df1=df.groupby(["宝贝标题"])["宝贝总数量"].sum().head()
#两层结构转为key  value
mydict=df1.to_dict()
#遍历key  value值
for i,j in mydict.items():print(i,':\t', j)

DataFrame转列表

import pandas as pd
df = pd.read_excel('mrbooks.xls')
#取“买家会员名”的列值,head取前五行
df1=df[['买家会员名']].head()
list1=df1['买家会员名'].values.tolist()
for s in list1:print(s)

转元组

import pandas as pd
df = pd.read_excel('fl4.xls')
#取两列,前5行
df1=df[['label1','label2']].head()
#元组值得录入
tuples = [tuple(x) for x in df1.values]
for t in tuples:print(t)

转html

import pandas as pd
#usecols取买家和标题列值
df=pd.read_excel('mrbooks.xls',usecols=['买家会员名','宝贝标题']).head()
#结果集合转html
df.to_html('mrbooks.html',header = True,index = False)

4.6数据合并

数据合并(merge)

常规合并

import pandas as pd
#列名标题合并
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df1 = pd.DataFrame({'编号':['mr001','mr002','mr003'],'语文':[110,105,109],'数学':[105,88,120],'英语':[99,115,130]})
df2 = pd.DataFrame({'编号':['mr001','mr002','mr003'],'体育':[34.5,39.7,38]})####合并 传入dataframe1和dataFrame2对象,指定合并列名。完成两表合并
df_merge=pd.merge(df1,df2,on="编号")
print(df_merge)
import pandas as pd
#索引合并
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df1 = pd.DataFrame({'编号':['mr001','mr002','mr003'],'语文':[110,105,109],'数学':[105,88,120],'英语':[99,115,130]})
df2 = pd.DataFrame({'编号':['mr001','mr002','mr003'],'体育':[34.5,39.7,38]})
df_merge2=pd.merge(df1,df2,right_index=True,left_index=True)
print(df_merge2)

合并去重

import pandas as pd
###on="标题",right_index=True,left_index=True
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df1 = pd.DataFrame({'编号':['mr001','mr002','mr003'],'语文':[110,105,109],'数学':[105,88,120],'英语':[99,115,130]})
df2 = pd.DataFrame({'编号':['mr001','mr002','mr003'],'体育':[34.5,39.7,38]})
df_merge=pd.merge(df1,df2,on="编号",right_index=True,left_index=True)
print(df_merge)
import pandas as pd
###df为主
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df1 = pd.DataFrame({'编号':['mr001','mr002','mr003'],'语文':[110,105,109],'数学':[105,88,120],'英语':[99,115,130]})
df2 = pd.DataFrame({'编号':['mr001','mr002','mr003'],'体育':[34.5,39.7,38]})
#合并为左合并,以df为主
df_merge=pd.merge(df1,df2,on="编号",how="left")
print(df_merge)

多对一数据合并

import pandas as pd
####存在mr001的两条数据,合并出现两条编号为mr001的信息
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df1 = pd.DataFrame({'编号':['mr001','mr002','mr003'],'学生姓名':['明日同学','高猿员','钱多多']})df2 = pd.DataFrame({'编号':['mr001','mr001','mr003'],'语文':[110,105,109],'数学':[105,88,120],'英语':[99,115,130],'时间':['1月','2月','1月']})
df_merge=pd.merge(df1,df2,on='编号')
print(df_merge)

多对多数据合并

### 多对多的数据合并
import pandas as pd
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df1 = pd.DataFrame({'编号':['mr001','mr002','mr003','mr001','mr001'],'体育':[34.5,39.7,38,33,35]})df2 = pd.DataFrame({'编号':['mr001','mr002','mr003','mr003','mr003'],'语文':[110,105,109,110,108],'数学':[105,88,120,123,119],'英语':[99,115,130,109,128]})#如果不指定某一列,去合并。重复数据,自动的多对多的数据互补
df_merge=pd.merge(df1,df2)
print(df_merge)

数据合并(使用Cancat方法)

形同字段首尾相接

import pandas as pd
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df1 = pd.DataFrame({'编号':['mr001','mr002','mr003','mr001','mr001'],'体育':[34.5,39.7,38,33,35]})df2 = pd.DataFrame({'编号':['mr001','mr002','mr003','mr003','mr003'],'语文':[110,105,109,110,108],'数学':[105,88,120,123,119],'英语':[99,115,130,109,128]})
frames = [df1, df2]
df_merge=pd.concat(frames,keys=['1部分','2部分'])
print(df_merge)

横向表合并(行对齐)

提供部分核心的代码为

df_merge=pd.concat(frames,axis=1)
print(df_merge

交叉合并

提供部分核心的代码为

result=pd.concat([df1,df2],axis=1,join='inner')
print(result)

4.7数据导出

导出为.xlsx文件

import pandas as pd
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df1 = pd.DataFrame({'编号':['mr001','mr002','mr003','mr001','mr001'],'体育':[34.5,39.7,38,33,35]})df2 = pd.DataFrame({'编号':['mr001','mr002','mr003','mr003','mr003'],'语文':[110,105,109,110,108],'数学':[105,88,120,123,119],'英语':[99,115,130,109,128]})#如果不指定某一列,去合并。重复数据,自动的多对多的数据互补
df_merge=pd.merge(df1,df2)
df_merge.to_excel("merge.xlsx")

可指定sheet的name的名字

df_merge.to_excel("merge2.xlsx",sheet_name='df1')

导出为.csv文件

核心代码如下

#指定分隔符
df_merge.to_csv("Result.csv",sep='?')
#缺失值替换为
df_merge.to_csv("Result.csv",na_rep="NA")
#格式化数据,保留两位小数
df_merge.to_csv("Result.csv",float_format="%.2f")
#保留某列数据,保存索引列和name列
df_merge.to_csv("Result.csv",columns=['编号'])#保留列名,不保留行索引编号
df_merge.to_csv("Result.csv",header=True,index=False)

导出多个sheet页中

df1.to_excel("df.xlsx",sheet_name="df1")  #df1内容写到df文件的df1的sheet中
work=pd.ExcelWriter("df2.xlsx") #打开一个新的excel文件
df1.to_excel(work,sheet_name="df2")  #df1内容再次写到df2文件的df2的sheet中
df1['编号'].to_excel(work,sheet_name="df3")  #取df1的编号一列,写到df2文件的df3的sheet中
work.save()  #保存

4.8 日期数据处理

DataFrame的日期数据转换

import pandas as pd
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df=pd.DataFrame({'原日期':['14-Feb-20', '02/14/2020', '2020.02.14', '2020/02/14','20200214']})
df['转换后的日期']=pd.to_datetime(df['原日期'])
print(df)
import pandas as pd
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df = pd.DataFrame({'year': [2018, 2019,2020],'month': [1, 3,2],'day': [4, 5,14],'hour':[13,8,2],'minute':[23,12,14],'second':[2,4,0]})
df['组合后的日期']=pd.to_datetime(df)
print(df)

dt对象使用

#数组合并日期
#解决行列不齐的情况
pd.set_option('display.unicode.east_asian_width', True)
pd.set_option('display.unicode.ambiguous_as_wide', True)
df2 = pd.DataFrame({'date':['2020-01-21 10:20:23', '2020-01-22 11:20:23', '2020-12-31 10:50:33']})
df2['年月日']=pd.to_datetime(df2.date).dt.date
df2['年']=pd.to_datetime(df2.date).dt.year
df2['月']=pd.to_datetime(df2.date).dt.month
df2['日']=pd.to_datetime(df2.date).dt.day
df2['星期数']=pd.to_datetime(df2.date).dt.day_name()
df2['季度']=pd.to_datetime(df2.date).dt.quarter
df2['年底最后一天']=pd.to_datetime(df2.date).dt.is_year_end
print(df2)

获取日期、金额的区间数据

import pandas as pd
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
df = pd.read_excel('mingribooks.xls')
df1=df[['订单付款时间','买家会员名','联系手机','买家实际支付金额']] #取出表格中的几列信息值
df1=df1.sort_values(by=['订单付款时间'])  #按照订单付款时间排序
df1 = df1.set_index('订单付款时间') # 将日期设置为索引#只是获取某些区间数据
print(df1['2018-05-11':'2018-05-14'])##按照金额的排序,获取200到500金额的数据
df2=df1.sort_values(by=['买家实际支付金额'])  #按照订单付款时间排序
df2 = df2.set_index('买家实际支付金额') # 将日期设置为索引
print(df2[200:500])

按照不同时期统计并显示数据

按时期统计数据

import pandas as pd
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
df = pd.read_excel('mingribooks.xls')
df1=df[['订单付款时间','买家会员名','联系手机','买家实际支付金额']] #取出表格中的几列信息值
df1=df1.sort_values(by=['订单付款时间'])  #按照订单付款时间排序
df1 = df1.set_index('订单付款时间') # 将日期设置为索引#数据转换为Datatime数据,并通过df1.index索引排列
pd.to_datetime(df1.index)
#年统计数据
print(df1.resample('AS').sum())
#季度统计数据
print(df1.resample('Q').sum())
#月度统计数据
print(df1.resample('M').sum())
#星期统计数据
print(df1.resample('W').sum())
#天统计数据
print(df1.resample('D').sum())

按时期显示数据
部分核心代码

........
df1=df[['订单付款时间','买家会员名','联系手机','买家实际支付金额']] #取出表格中的几列信息值
df1.to_period('A') #按年
print(df1.head())
df1.to_period('Q') #按季度
print(df1.head())
df1.to_period('M') #按月
print(df1.head())
df1.to_period('W') #按星期
print(df1.head())

按照时区统计并显示数据

核心代码如下

........
#按照年统计显示数据
print(df1.resample("AS").sum().to_period('A'))
#按季度统计并显示数据
print(df1.resample("Q").sum().to_period('Q'))
#按照约月度统计并显示数据
print(df1.resample("M").sum().to_period('M'))
#按照星期统计并显示数据
print(df1.resample("W").sum().to_period('w'))

时间序列

重采样(Resample)

将一分钟序列转换为3分钟

import pandas as pd#调用date_range的生成一天1分钟时间间隔序列
index = pd.date_range('02/02/2020', periods=9, freq='T')
#Series序列的9个
series = pd.Series(range(9), index=index)
print(series)
#时间序列转换,统计和
print(series.resample('3T').sum())

降采样抽取

按周统计销售数据

import pandas as pd
#设置数据显示的列数和宽度
pd.set_option('display.max_columns',500)
pd.set_option('display.width',1000)
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
#读取exec的文件
df=pd.read_excel('time.xls')
df1 = df.set_index('订单付款时间') #设置“订单付款时间”为索引
#按照天统计数
df_D=df1.resample('D').sum()
print(df_D)
df_D.to_excel('dd.xls')

升采样处理

6小时进行一次数据统计

# 降采样处理
import pandas as pd
import numpy as np
#,periodsge固定时期设置为2,代表生成20200202和20200203两天
rng = pd.date_range('20200202', periods=2)
#np值为1,2
s1 = pd.Series(np.arange(1,3), index=rng)
#时间序列为6,重采样为6H,进行搞频率
s1_6h_asfreq = s1.resample('6H').asfreq()
print(s1_6h_asfreq)#时间序列为6,重采样为6H,pad缺失填充
s1_6h_pad = s1.resample('6H').pad()
print(s1_6h_pad)
#时间序列为6,重采样为6H,ffill缺失填充
s1_6h_ffill = s1.resample('6H').ffill()
print(s1_6h_ffill)
#时间序列为6,重采样为6H,bfill缺失填充
s1_6h_bfill = s1.resample('6H').bfill()
print(s1_6h_bfill)

时间序列数据汇总(Ohlc函数)

5分钟的序列数据汇总

# 时间序列数据汇总(ohlc函数)
import pandas as pd
import numpy as np
#分钟,固定时期为12分钟
rng = pd.date_range('2/2/2020',periods=12,freq='T')
#生成12个序列
s1 = pd.Series(np.arange(12),index=rng)
#时间时间序列汇总,每隔5分钟
print(s1.resample('5min').ohlc())

移动窗口数据计算

使用solling函数计算3天的均值

import pandas as pd
index=pd.date_range('20200201','20200215')
data=[3,6,7,4,2,1,3,8,9,10,12,15,13,22,14]
s1_data=pd.Series(data,index=index)
print(s1_data.rolling(3).mean())

当天的数据代表窗口数据

import pandas as pd
index=pd.date_range('20200201','20200215')
data=[3,6,7,4,2,1,3,8,9,10,12,15,13,22,14]
s1_data=pd.Series(data,index=index)
#min_periods为当天的数据
print(s1_data.rolling(3, min_periods=1).mean())

Pandas数据分析第2部分相关推荐

  1. pandas 数据分析 相关性_探索 COVID-19 新冠数据来学习 Pandas

    来源:python中文社区 本文约2100字,建议阅读6分钟. 使用 pandas 数据分析工具来学习一些基本的 pandas 命令,并探索数据集中包含的内容. 欧洲疾病预防控制中心(https:// ...

  2. pandas数据分析选则接近数值的最接优方案

    import numpy as np import pandas as pd# pandas数据分析选则接近数值的最接优方案# 1.准备数据 CHILD_TABLE = (720, 750) CHID ...

  3. Pandas数据分析——Task2

    练习题 Ex1:口袋妖怪数据集 现有一份口袋妖怪的数据集,下面进行一些背景说明: #代表全国图鉴编号,不同行存在相同数字则表示为该妖怪的不同状态 妖怪具有单属性和双属性两种,对于单属性的妖怪,Type ...

  4. Pandas数据分析groupby函数深度总结(1)

    Pandas数据分析groupby函数深度总结(1) groupby分组数据 加载数据 数据分组 按'Sales Rep'列分组 显示所有分组 选择一个特定的组 计算每组中的行数 按'Sales Re ...

  5. pandas数据分析给力教程【完整版】(七)

    Pandas绘图 上一篇:pandas数据分析给力教程[完整版](六) Series和DataFrame都有一个用于生成各类图表的plot方法.默认情况下,它们所生成的是线形图 线形图 简单的Seri ...

  6. Pandas数据分析案例(盛华化工锅炉排放数据可视化分析)

    Pandas数据分析案例(盛华化工锅炉排放数据可视化分析) 实验环境 数据集介绍 问题描述 实验步骤 一.数据导入与观察 二.数据转换 三.数据可视化分析 相关资源 实验环境 操作系统:Linux/W ...

  7. Pandas数据分析实战01--Abalone Data Set(鲍鱼数据集)

    Pandas数据分析实战01 1. 数据描述 2. 数据读取 3. 数据呈现 4. 数据分析 打算从基础开始学习数据分析,给自己一个整理内容和学习消化的时间,所以,这也将成为我的学习笔记. 1. 数据 ...

  8. CC00038.python——|HadoopPython.v02|——|Arithmetic.v02|Pandas数据分析库:Pandas数据结构|

    一.pandas数据分析库 ### --- pandas数据分析库~~~ Python在数据处理和准备⽅⾯⼀直做得很好,但在数据分析和建模⽅⾯就差⼀些. ~~~ pandas帮助填补了这⼀空⽩,使您能 ...

  9. pandas数据分析给力教程【完整版】(五)

    pandas的拼接操作 上一篇:pandas数据分析给力教程[完整版](四) 下一篇:pandas数据分析给力教程[完整版](六) pandas的拼接分为两种: 级联:pd.concat, pd.ap ...

  10. Pandas数据分析—groupby分组统计

    13.Pandas中groupby分组统计 文章目录 13.Pandas中groupby分组统计 前言 一.分组使用聚合函数做数据统计 1.准备数据 二.遍历groupby的结果理解执行流程 三.实例 ...

最新文章

  1. python中的random模块学习
  2. 一些mysql innodb的建议
  3. 【Effective Java】最佳实践 其他合集
  4. VC++生成序列号和注册机总结
  5. 结对项目——电梯调度算法的实现和测试
  6. java jdbc rowset_JAVA基础知识之JDBC——RowSet
  7. 2022.管理类软件工具
  8. centos 使用yum 安装出现 File contains no section headers 错误解决方法
  9. Vue三大核心概念之二(事件)
  10. c语言学函数,c语言学习常用函数(9页)-原创力文档
  11. 机器学习中五种常用的聚类算法
  12. 车标识别 YOLOv5 YOLOv3 支持奔驰宝马奥迪等车标
  13. 计算机组成原理6-20,计算机组成原理课后题6.20PPT课件
  14. 广域网宽带接入技术七GPON技术
  15. 扒开系统调用的三层皮(上)
  16. HWA是什么?HWA会带来什么影响?和 HiRes,LDAC,L2HC有什么区别?
  17. python-PIL生成棋盘纹理图片
  18. Talk | 清华大学交叉信息研究院助理教授杜韬:利用计算方法探究流固耦合
  19. 阿里云视频点播指定清晰度
  20. 曾李青的五年投资经验总结:早期创业公司的九种死法

热门文章

  1. kubernetes: CNI解读
  2. starops 云效运维 文档_云效手册专有云版.pdf
  3. 达梦数据库(DM8)初次使用及DCA考试体会
  4. WebRTC NACK
  5. JavaScript除数不为0异常处理
  6. Python实现二维码扫码登录
  7. springboot返回对象报No serializer found for class xxx and no properties discovered to create BeanSerializ
  8. 股票大作手杰西·利弗莫尔语录集锦
  9. 儿童拼图游戏软件测试,宝宝益智英语字母拼图大全(测试版)
  10. 想学python网课哪个好过_求问一下jrs们,零基础学python哪个网课好?