python数据分析入门【二】 — 数据处理
上一章内容python数据分析入门【一】 — DataFrame & Series
下一章内容python数据分析入门【三】 — 数据分析
文章目录
python数据分析入门【二】 --- 数据处理1、数据导入和导出1.1 数据的导入1)一般方式导入文件2)导入csv文件3)导入文本文件4)导入excel文件(后缀xlsx)
1.2 数据的导出1)导出csv/txt文件2)导出xlsx文件
2、值处理A、重复值处理2.1 用duplicated()找出重复位置1)找出行的重复位置2)根据列,找出重复位置
2.2 用drop_duplicates()删除重复值1)根据行重复值进行删除2)通过指定列,删除重复值
2.3 向量化计算提取重复值
B、缺失值处理2.1、缺失值的产生和处理方法2.2、用 isnull() 找到空值位置2.3、获取空值所在的行1)默认所有列2)指定判断空值的列
2.4、用 fillna() 填充空值2.5、用 dropna() 删除空值所在的行
C、空格值处理2.1、用str.strip()处理某一列的空格值2.2、将处理好的数据放回原列
3、字段处理A、字段抽取3.1、用Series.astype()转换数据类型3.2、用str.slice()字段抽取
B、字段拆分3.1、用split()拆分得到DataFrame3.2、用split()拆分得到Series
C、字段合并D、字段匹配3.1、用pd.merge()左连接3.2、用pd.merge()右连接3.3、用pd.merge()外连接
4、记录处理A、记录抽取4.1、比较运算4.2、范围运算4.3、空值匹配4.4、根据关键字过滤
B、随机抽样4.1、按个数抽样4.2、按百分比抽样4.3、可放回的抽样4.4、分层抽样
C、记录合并4.1、数据框结构相同时的合并4.2、数据框结构不同时的合并
5、其余操作A、简单计算B、数据标准化C、数据分组5.1、用df.groupby()按字段值分组(定性分组)5.2、用pd.cut按区间分组(定量分组)5.3、用pd.cut按区间自定义标签分组(定量分组)
D、时间处理5.1、用to_datetime()时间转换5.2、用dt.strftime()格式化时间5.3、用dt.xx抽取时间属性
E、时间抽取5.1、时间处理5.2、按索引抽取5.3、按时间列(dateTime)抽取
6、虚拟变量6.1、Series.map()处理有大小关系的离散变量6.2、pd.get_dummies()处理无大小关系的离散变量
1、数据导入和导出
1.1 数据的导入
1)一般方式导入文件
用python内置的open()和read(),缺点是不能对数据按格式划分,并封装成可计算的对象
data = open('E://python//数据集//数据分析入门//1.csv').read()
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826165819307.png#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826165832675.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzOTM0NDI3,size_16,color_FFFFFF,t_70#pic_center)
2)导入csv文件
使用pd.read_csv(),如果存在中文路径会报错,此时使用open()打开文件即可(参考https://blog.csdn.net/qq_35318838/article/details/80564938)。得到的数据会被封装成DataFrame对象 pd.read_csv()默认分隔符是’,’ from pandas import read_csv
# 这样读文件会报错:OSError: Initializing from file failed
# df = read_csv(
# 'E://python//数据集//数据分析入门//1.csv'
# )
df = read_csv(open('E://python//数据集//数据分析入门//1.csv'))
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826165852187.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzOTM0NDI3,size_16,color_FFFFFF,t_70#pic_center)
pd.read_csv()修改分隔符seq,并修改列名names df4 = read_csv(
open('E://python//数据集//数据分析入门//4.11 字段合并/data.csv'),
names=['brand','area','num'],
sep=' '
)
3)导入文本文件
注意文本文件一上来就是数据,没有表头,所以要设置列名,并设置分隔符。
"""用read_table导入文本文件(文本文件一上来就是数据,没有表头)"""
from pandas import read_table
df1 = read_table(open('E://python//数据集//数据分析入门//1.txt'))
df2 = read_table(
open('E://python//数据集//数据分析入门//1.txt'),
#设置列名
names=['name', 'age', 'gender'],
#分隔符
sep=','
)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826170002135.png#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826170013908.png#pic_center)
4)导入excel文件(后缀xlsx)
对于导入文件编码错误问题,可以用encoding指定编码格式
from pandas import read_excel
df3 = read_excel(
'E://python//数据集//数据分析入门//1.xlsx',
#不设置编码格式,会报错:UnicodeDecodeError: 'gbk' codec can't
#decode byte 0x90 in position 22: illegal multibyte sequence
encoding='UTF-8'
)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826170029779.png#pic_center)
1.2 数据的导出
1)导出csv/txt文件
用df.to_csv()导出csv,文本等文件,可以设置index=False,表示不打印索引列(没有to_table())
"""D:用to_csv导出csv,文本,xlsx等文件"""
from pandas import DataFrame
DataFrame.to_csv()
df.to_csv(
'E://python//数据集//数据分析入门//2.csv',
#不打印索引列
index=False
)
df2.to_csv('E://python//数据集//数据分析入门//2.txt')
![在这里插入图片描述](https://img-blog.csdnimg.cn/202008261701500.png#pic_center)
2)导出xlsx文件
用df.to_xlsx()导出csv,文本等文件,可以设置index=False,表示不打印索引列
df3.to_excel('E://python//数据集//数据分析入门//2.xlsx',encoding='UTF-8')
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826170215835.png#pic_center)
2、值处理
值处理包括:重复值,缺失值,空格值的处理
A、重复值处理
import pandas as pd
df = pd.read_csv(
open(r"E://python/数据集/数据分析入门/data.csv")
)
df4 = pd.DataFrame(df)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826170247352.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzOTM0NDI3,size_16,color_FFFFFF,t_70#pic_center)
2.1 用duplicated()找出重复位置
1)找出行的重复位置
duplicated()不指定列,则对行(所有列)进行重复值位置查找
"""找出行的重复位置"""
# 得到重复行的索引系列
dIndex = df4.duplicated()
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826170305513.png#pic_center)
2)根据列,找出重复位置
"""根据某些列,找到重复的位置"""
dIndex = df4.duplicated("id")
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826170331103.png#pic_center)
dIndex = df4.duplicated(["id","name"])
根据返回值,把重复数据提取出来 df[dIndex]
2.2 用drop_duplicates()删除重复值
1)根据行重复值进行删除
"""用drop_duplicate(),直接删除重复值(会保留唯一一条数据)"""
# 默认根据所有的列,进行删除(数据结构中,行相同的数据只保留一行)
newDF = df4.drop_duplicates()
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826170428209.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzOTM0NDI3,size_16,color_FFFFFF,t_70#pic_center)
2)通过指定列,删除重复值
newDF1 = df4.drop_duplicates(["id","name"])
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826170447633.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzOTM0NDI3,size_16,color_FFFFFF,t_70#pic_center)
2.3 向量化计算提取重复值
对于boolean类型的一维数组A,可以根据A,利用向量化计算,提取重复值数据。
dIndex = df4.duplicated(["id","name"])
"""根据返回值,把重复数据提取出来"""
df[dIndex]
---
Out[38]:
id name age gender
3 1251147 wang2 22 male
5 1251147 wang2 22 female
B、缺失值处理
2.1、缺失值的产生和处理方法
缺失值的产生:
有些信息暂时无法获取有些信息被遗漏或者错误处理了(年龄那一列要求是数字,但是填入了‘a’,‘b’)
缺失值的处理方法:
数据补齐(填充平均值)删除对应缺失行(数据量少慎用)删除对应缺失行不处理
2.2、用 isnull() 找到空值位置
from pandas import read_csv
df = read_csv(
open(r"E:\python\数据集\数据分析入门\4.4 缺失值处理\data.csv")
)
"""A:找出空值的位置,空值位置显示true"""
isNA = df.isnull()
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826170531585.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzOTM0NDI3,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826170542265.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzOTM0NDI3,size_16,color_FFFFFF,t_70#pic_center)
2.3、获取空值所在的行
1)默认所有列
from pandas import DataFrame
isNa = DataFrame(isNA)
"""B:获取空值所在的行(对于所有列来说)"""
#Return whether any element is True over
#requested axis.
#说白了,判断所有列,如果某一列存在一个true值,则该行返回true
#如果全为false,则返回false
df[isNa.any(axis = 1)]
---
Out[9]:
id key value
2 1251147 商品毛重 NaN
3 1251147 NaN 中国
2)指定判断空值的列
"""C:获取某一列含有NA值的行"""
#注意Dataframe如何访问单列/多列,如果是[[]],即里面是series的话,输出会保留列名;
#如果是[],输出不会保留列名;
#如果使用单列1访问,则会报:ValueError: No axis named 1 for
#object type
df[isNa[['key']].any(axis = 1)]
---
Out[10]:
id key value
3 1251147 NaN 中国
df[isNa[['key','value']].any(axis = 1)]
---
Out[11]:
id key value
2 1251147 商品毛重 NaN
3 1251147 NaN 中国
2.4、用 fillna() 填充空值
'''D:填充空值'''
df.fillna('未知')
---
Out[12]:
id key value
0 1251147 品牌 Apple
1 1251147 商品名称 苹果iPad mini 3
2 1251147 商品毛重 未知
3 1251147 未知 中国
4 1251147 硬盘 128G
5 1251147 尺寸 7.8英寸-9英寸
2.5、用 dropna() 删除空值所在的行
'''E:删除空值所在的行(不是在原数据上删除)'''
newDF = df.dropna()
newDF
---
Out[14]:
id key value
0 1251147 品牌 Apple
1 1251147 商品名称 苹果iPad mini 3
4 1251147 硬盘 128G
5 1251147 尺寸 7.8英寸-9英寸
C、空格值处理
2.1、用str.strip()处理某一列的空格值
from pandas import read_csv
from pandas import Series
from pandas import Index
df = read_csv(
open(r"E:\python\数据集\数据分析入门\4.5 空格值处理\data.csv")
)
---
'''一列可作为Series,会自动添加缺失的索引'''
# Vectorized string functions for Series and Index
# 该语法会报错:Series s = df['name']
# 也不能作为索引:Index index = df['name'],语法会报错
'''注意Python对象类型转换和java的区别'''
s = Series(df['name'])
type(df['name'])
# pandas.core.series.Series
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826170559332.png#pic_center)
'''A:处理某一列的空格值'''
#'DataFrame' object has no attribute 'str'
# 注意DataFrame.str不存在,而Series.str存在
'''处理左空格'''
newName = df['name'].str.lstrip()
---
Out[18]:
0 KEN
1 JIMI
2 John
'''处理右空格'''
newName1 = df['name'].str.rstrip()
---
Out[23]:
0 KEN
1 JIMI
2 John
'''处理左右空格'''
newName2 = df['name'].str.strip()
---
Out[25]:
0 KEN
1 JIMI
2 John
2.2、将处理好的数据放回原列
'''B:将处理好的数据放回原来的列'''
df['name'] = newName2
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826170615942.png#pic_center)
3、字段处理
A、字段抽取
字段抽取:
根据已知列数据的开始和结束位置,抽取出新的列。例如对于电话号:138 0013 8000,其中138是运营商,0013是地区,8000是号码
from pandas import read_csv
from pandas import Series
df = read_csv(
open(r"E:\python\数据集\数据分析入门\4.6 字段抽取\data.csv")
)
type(df.at[0,'tel'])
---
Out[35]: numpy.int64
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826170631665.png#pic_center)
3.1、用Series.astype()转换数据类型
# Cast a pandas object to a specified dtype dtype.
Series.astype()
'''A:用Series.astype(),将电话号转成字符串'''
df['tel'] = df['tel'].astype(str)
type(df.at[0,'tel'])
---
Out[37]: str
3.2、用str.slice()字段抽取
# 运营商
brand = df['tel'].str.slice(0,3)
# 地区
area = df['tel'].str.slice(3,7)
# 号码段
nums = df['tel'].str.slice(7,11)
#赋值回去
df['brand'] = brand
df['area'] = area
df['nums'] = nums
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826170653641.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzOTM0NDI3,size_16,color_FFFFFF,t_70#pic_center)
B、字段拆分
字段拆分:按照固定的字符,拆分已有字符串
from pandas import read_csv
df = read_csv(
open(r"E:\python\数据集\数据分析入门\4.7 字段拆分\data.csv"),
)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826170716264.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzOTM0NDI3,size_16,color_FFFFFF,t_70#pic_center)
3.1、用split()拆分得到DataFrame
# =============================================================================
# split(sep,n,expand=False)
# 参数说明:
# sep用于分割的字符串,
# n分割为多少列,
# expand为true,则返回DataFrame
# expand为false,则返回Series
# =============================================================================
# 1表示将数据分割成2列,返回值为DataFrame
newDF = df['name'].str.split(' ', 1, True)
#依次修改DataFrame的列名
newDF.columns = ['band','name']
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826170733142.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzOTM0NDI3,size_16,color_FFFFFF,t_70#pic_center)
3.2、用split()拆分得到Series
newDF1 = df['name'].str.split(' ', 2, False)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826170754506.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzOTM0NDI3,size_16,color_FFFFFF,t_70#pic_center)
C、字段合并
字段合并:指将同一个数据框中的不同的列,进行合并,形成新的列(字段拆分的逆操作)
# 字段合并方法:x1 + x2 + x3,合并后返回一个Series
df4 = read_csv(
open('E://python//数据集//数据分析入门//4.11 字段合并/data.csv'),
names=['brand','area','num'],
sep=' '
)
![在这里插入图片描述](https://img-blog.csdnimg.cn/202008261708104.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzOTM0NDI3,size_16,color_FFFFFF,t_70#pic_center)
注意先将Int64转化成str,才能进行字段合并(字符串加法)
# 注意先将Int64转化成str,才能进行字段合并
# data1 = df4['brand'] + df4['area'] + df4['num']
# Cast a pandas object to a specified dtype ``dtype``
df4 = df4.astype(str)
data1 = df4['brand'] + df4['area'] + df4['num']
df4['tel'] = data1
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826170828611.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzOTM0NDI3,size_16,color_FFFFFF,t_70#pic_center)
D、字段匹配
字段匹配:根据各表共有的关键字段(eg:id字段,且数据类型一致),把各表所需的记录一一对应起来,组成一条新的记录
from pandas import read_csv
import pandas as pd
df1 = read_csv(
open('E://python//数据集//数据分析入门//4.12 字段匹配/data1.csv'),
names=['id','comments','title'],
sep='|'
)
df2 = read_csv(
open('E://python//数据集//数据分析入门//4.12 字段匹配/data2.csv'),
names=['id','oldPrice','nowPrice'],
sep='|'
)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826170917383.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzOTM0NDI3,size_16,color_FFFFFF,t_70#pic_center)
3.1、用pd.merge()左连接
# ============================================================================
# merge(x,y,left_on,right_on)
# x:第一个数据框
# y:第二个数据框
# left_on:第一个数据框用于匹配的列(共同字段名,不是Series)
# right_on:第二个数据框用于匹配的列(共同字段名,不是Series)
# 返回DataFrame
# ============================================================================
data1 = pd.merge(
left = df1,
right= df2,
left_on = 'id',
right_on= 'id',
how = "left"
)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826170952249.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzOTM0NDI3,size_16,color_FFFFFF,t_70#pic_center)
3.2、用pd.merge()右连接
'''B:右连接,即使连接不上,也保留右边没连上的部分'''
data2 = pd.merge(
left = df1,
right= df2,
# left_on = df1['id'],
# right_on= df2['id'],
left_on='id',
right_on='id',
how = "right"
)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826171008142.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzOTM0NDI3,size_16,color_FFFFFF,t_70#pic_center)
3.3、用pd.merge()外连接
'''C:外连接,即使连接不上,也保留没连上的部分'''
data3 = pd.merge(
left = df1,
right= df2,
# left_on = df1['id'],
# right_on= df2['id'],
left_on='id',
right_on='id',
how = "outer"
)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826171025323.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzOTM0NDI3,size_16,color_FFFFFF,t_70#pic_center)
4、记录处理
A、记录抽取
记录抽取:指根据一定的条件,对数据进行抽取
from pandas import read_csv
import pandas as pd
df = read_csv(
open(r"E:\python\数据集\数据分析入门\4.8 记录抽取\data.csv"),sep='|'
)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826171049173.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzOTM0NDI3,size_16,color_FFFFFF,t_70#pic_center)
4.1、比较运算
'''A:比较运算'''
df1 = df[df['comments'] > 10000]
df2 = df[df.comments > 10000]
结果都是 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826171112720.png#pic_center)
4.2、范围运算
'''B:范围运算'''
df3 = df[df.comments.between(1000,10000)]
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020082617115350.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzOTM0NDI3,size_16,color_FFFFFF,t_70#pic_center)
'''也可以是组合的逻辑运算(结果同上)'''
df7 = df[(df.comments > 1000) & (df.comments
1: 0.2,
2: 0.4,
3: 0.6
}
def typicalSampling1(group,typicalFracDict):
name = group.name
frac = typicalFracDict[name]
return group.sample(frac = frac)
result2 = df.groupby(
'class',
#不将组键(键值对)添加到索引,而是将值添加到索引
group_keys = True
).apply(typicalSampling1,typicalFracDict)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826171512837.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzOTM0NDI3,size_16,color_FFFFFF,t_70#pic_center)
C、记录合并
记录合并:指将两个结构相同的数据框,合并成一个数据框
from pandas import concat
from pandas import read_csv
#seq默认为,
df = read_csv(
open('E://python//数据集//数据分析入门//4.10 记录合并/data1.csv'),
sep='|'
)
df1 = read_csv(
open('E://python//数据集//数据分析入门//4.10 记录合并/data2.csv'),
sep='|'
)
df2 = read_csv(
open('E://python//数据集//数据分析入门//4.10 记录合并/data3.csv'),
sep='|'
)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826171531234.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzOTM0NDI3,size_16,color_FFFFFF,t_70#pic_center)
4.1、数据框结构相同时的合并
'''A:数据框结构相同时合并'''
# =============================================================================
# concat参数是一个DataFrame或Series的列表
# objs : a sequence or mapping of Series, DataFrame, or Panel objects
# =============================================================================
data = concat([df,df1,df2])
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826171550561.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzOTM0NDI3,size_16,color_FFFFFF,t_70#pic_center)
4.2、数据框结构不同时的合并
'''B:数据框结构不同时,先进行列的筛选再合并(为筛选的列填空值)'''
data = concat([
df[['id','comments']],
df1[['comments','title']],
df2[['id','title']]
])
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826171619837.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzOTM0NDI3,size_16,color_FFFFFF,t_70#pic_center)
5、其余操作
A、简单计算
简单计算:指通过对已有字段进行加减乘除等运算,得到新的字段
'''A:简单计算'''
df1 = pd.read_csv(
open('E://python//数据集//数据分析入门//4.13 简单计算/data.csv'),
sep='|'
)
df1['totalPrice'] = df1['price'] * df1['num']
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826171657842.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzOTM0NDI3,size_16,color_FFFFFF,t_70#pic_center)
B、数据标准化
数据标准化:指将数据按比例缩放,使之落入到特定区间,方便不同变量的比较关系:聚类分析,主成分分析等。
0-1标准化(方便十分制,百分制的换算): $ x^* = \frac{x - min}{max -min}$
'''B:数据标准化'''
df2 = pd.read_csv(
open('E://python//数据集//数据分析入门//4.14 数据标准化/data.csv'),
sep=','
)
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020082617172167.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzOTM0NDI3,size_16,color_FFFFFF,t_70#pic_center)
'''0-1标准化(保留2位小数)'''
df2.score = round(
(df2.score - df2.score.min()) / (df2.score.max() - df2.score.min()),
2
)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826171738309.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzOTM0NDI3,size_16,color_FFFFFF,t_70#pic_center)
C、数据分组
数据分组:根据数据分析对象的特征,按照一定的数值指标,把数据分析对象划分为不同的区间进行研究,以揭示其内在的联系和规律性。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826171801194.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzOTM0NDI3,size_16,color_FFFFFF,t_70#pic_center)
5.1、用df.groupby()按字段值分组(定性分组)
import pandas as pd
import numpy as np
df1 = pd.read_csv(
open('E://python//数据集//数据分析入门//5.2 分组分析/data.csv'),
sep=','
)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826171824607.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzOTM0NDI3,size_16,color_FFFFFF,t_70#pic_center)
df2 = df1.groupby("class")
---
df2.groups
---
Out[26]:
{'一班': Int64Index([0, 1, 2, 3, 4], dtype='int64'),
'三班': Int64Index([9, 10, 11, 12], dtype='int64'),
'二班': Int64Index([5, 6, 7, 8], dtype='int64')}
df3 = df1.groupby(by = ['class','name'])
df3.groups
---
Out[27]:
{('一班', '朱凤'): Int64Index([1], dtype='int64'),
('一班', '朱志斌'): Int64Index([0], dtype='int64'),
('一班', '许杰'): Int64Index([4], dtype='int64'),
('一班', '郑丽萍'): Int64Index([2], dtype='int64'),
('一班', '郭杰明'): Int64Index([3], dtype='int64'),
('三班', '庄艺家'): Int64Index([12], dtype='int64'),
('三班', '方伟君'): Int64Index([11], dtype='int64'),
('三班', '方小明'): Int64Index([9], dtype='int64'),
('三班', '陈丽灵'): Int64Index([10], dtype='int64'),
('二班', '林良坤'): Int64Index([7], dtype='int64'),
('二班', '林龙'): Int64Index([6], dtype='int64'),
('二班', '郑芬'): Int64Index([5], dtype='int64'),
('二班', '黄志红'): Int64Index([8], dtype='int64')}
df3['score']
---
Out[28]:
注意
用DataFrameGroupBy.groups来获取分组记录用DataFrameGroupBy['name']来获取分组的某一列,方便对分组后的该列进行统计分析
5.2、用pd.cut按区间分组(定量分组)
# =============================================================================
# cut(series,bins,right=True,labels=NULL)
# series 需要分组的数据
# bins 分组的划分数组
# right 分组的时候,右边是否闭合
# labels 分组的自定义标签,可以不自定义
# =============================================================================
df3 = pd.read_csv(
open('E://python//数据集//数据分析入门//4.15 数组分组/data.csv'),
sep='|'
)
bins = [
min(df3.cost) - 1,20,30,40,50,60,max(df3.cost) + 1
]
# 区间右边不闭合
df3['cut'] = pd.cut(
df3.cost,
bins,
right=False
)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826171902977.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzOTM0NDI3,size_16,color_FFFFFF,t_70#pic_center)
5.3、用pd.cut按区间自定义标签分组(定量分组)
labels = [
'20以下','20到30','30到40','40到50','50到60','60以上'
]
df3['cut1'] = pd.cut(
df3.cost,
bins,
right = False,
labels = labels
)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826171922937.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzOTM0NDI3,size_16,color_FFFFFF,t_70#pic_center)
D、时间处理
时间转换:指将字符型的时间格式数据,转换成为时间型数据的过程时间格式化:将时间型数据,按照指定格式,转为字符型数据时间属性抽取:指从日期格式里面,抽取出需要的部分属性
5.1、用to_datetime()时间转换
'''1、时间转换'''
df4 = pd.read_csv(
open('E://python//数据集//数据分析入门//4.16 时间处理/data.csv'),
sep=','
)
dateTime = pd.to_datetime(
df4['注册时间'],
#format为数据中的时间格式
format='%Y/%m/%d'
)
df4['时间'] = dateTime
type(dateTime)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826171941556.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzOTM0NDI3,size_16,color_FFFFFF,t_70#pic_center)
5.2、用dt.strftime()格式化时间
'''2、时间格式化'''
# 使用时间的dt属性来格式化时间
df4['格式化时间'] = df4['时间'].dt.strftime('%Y-%m-%d')
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826172001229.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzOTM0NDI3,size_16,color_FFFFFF,t_70#pic_center)
5.3、用dt.xx抽取时间属性
'''3、时间属性抽取'''
# 使用时间的dt属性来抽取年,月,日...
df4['年'] = df4['时间'].dt.year
df4['月'] = df4['时间'].dt.month
df4['周'] = df4['时间'].dt.week
df4['日'] = df4['时间'].dt.day
df4['时'] = df4['时间'].dt.hour
df4['分'] = df4['时间'].dt.minute
df4['秒'] = df4['时间'].dt.second
E、时间抽取
时间抽取:指根据一定的条件,对时间格式的数据进行抽取
根据索引进行抽取根据时间列进行抽取
import pandas as pd
'''时间抽取'''
df1 = pd.read_csv(
open('E://python//数据集//数据分析入门//4.17 时间抽取/data.csv'),
sep=','
)
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020082617203749.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzOTM0NDI3,size_16,color_FFFFFF,t_70#pic_center)
5.1、时间处理
# =============================================================================
# @classmethod
# def strptime(cls, date_string, format):
# 'string, format -> new datetime parsed from a string (like time.strptime()).'
# import _strptime
# return _strptime._strptime_datetime(cls, date_string, format)
# =============================================================================
dateParser = lambda date : pd.datetime.strptime(
# date是每一次遍历的对象,不能用df1.date,
# date_string = date, format = "%Y%m%d" 会出现TypeError: strptime() takes no keyword arguments
date,"%Y%m%d"
)
#是一个function对象
type(dateParser)
---
function
# =============================================================================
# pd.read_csv
# date_parser : function, default None
# Function to use for converting a sequence of string columns to an array
# of datetime instances. The default uses dateutil.parser.parser to do the
# conversion. Pandas will try to call date_parser in three different ways,
# advancing to the next if an exception occurs: 1) Pass one or more arrays
# (as defined by parse_dates) as arguments; 2) concatenate (row-wise) the
# string values from the columns defined by parse_dates into a single array
# and pass that; and 3) call date_parser once for each row using one or more
# strings (corresponding to the columns defined by parse_dates) as arguments.
#
# parse_dates : boolean or list of ints or names or list of lists or dict, default False
# boolean. If True -> try parsing the index.
# list of ints or names. e.g. If [1, 2, 3] -> try parsing columns 1, 2, 3 each as a separate date column.
# list of lists. e.g. If [[1, 3]] -> combine columns 1 and 3 and parse as a single date column.
# dict, e.g. {'foo' : [1, 3]} -> parse columns 1, 3 as date and call result 'foo'
# =============================================================================
'''A:在读取文件时,将str类型的date列转化成dateTime类型'''
'''B:并将时间列作为索引列'''
df2 = pd.read_csv(
open('E://python//数据集//数据分析入门//4.17 时间抽取/data.csv'),
sep=',',
# 日期转换的方法
date_parser = dateParser,
# 要转换的日期所在的列
parse_dates = ['date','date1'],
#将'date'列作为索引列(时间从小到大排序)
index_col= 'date'
)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826172101673.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzOTM0NDI3,size_16,color_FFFFFF,t_70#pic_center)
5.2、按索引抽取
'''C:根据索引进行抽取'''
import datetime
dt1 = datetime.date(year=2016,month=2,day=1)
dt2 = datetime.date(year=2016,month=2,day=5)
#获取索引列中,dt1~dt2时间段内的数据
# =============================================================================
# Warning: Starting in 0.20.0, the .ix indexer is deprecated,
# in favor of the more strict .iloc and .loc indexers.
# =============================================================================
df2.ix[dt1:dt2]
df2.loc[dt1:dt2]
#获取dt1,dt2这两时间点的数据
df2.ix[[dt1,dt2]]
5.3、按时间列(dateTime)抽取
df3 = pd.read_csv(
open('E://python//数据集//数据分析入门//4.17 时间抽取/data.csv'),
sep=','
)
dt1 = datetime.date(year=2016,month=2,day=1)
dt2 = datetime.date(year=2016,month=2,day=5)
df3['date'] = pd.to_datetime(df1['date'],format='%Y%m%d')
type(df3.at[0,'date'])
---
pandas._libs.tslibs.timestamps.Timestamp
type(dt1)
---
datetime.date
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200826172127206.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzOTM0NDI3,size_16,color_FFFFFF,t_70#pic_center)
# 按时间列进行记录抽取
# 如果时间格式不匹配(eg:date和dateTime比较大小),好像不能用运算符比较大小;
# 但是用索引列(df.ix),即使时间格式不同,也可以比较时间
# df4 = df3[(df3.date >= dt1) & (df3.date = dt3) & (df3.date |