IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> python使用pandas模块介绍以及使用,dataframe结构,Series结构,基本数据操作DataFrame运算,pandas画图,存储,缺失值处理,离散化,合并 -> 正文阅读

[人工智能]python使用pandas模块介绍以及使用,dataframe结构,Series结构,基本数据操作DataFrame运算,pandas画图,存储,缺失值处理,离散化,合并

目录

1 pandas介绍

1.1 Pandas介绍

面板 数据 (三维数据)分析 计量经济学(数据分析80% 跑计量20%)
在这里插入图片描述

  • 以Numpy为基础,借力Numpy模块在计算方面性能高的优势
  • 基于matplotlib,能够简便的画图
  • 独特的数据结构

1.2 为什么使用Pandas

  • 便捷的数据处理能力
    在这里插入图片描述
  • 读取文件方便
  • 封装了Matplotlib、Numpy的画图和计算

1.3 案例:在numpy当中创建的股票涨跌幅数据形式

import numpy as np
import pandas as pd

# 创建一个符合正态分布的10个股票5天的涨跌幅数据
st_change = np.random.normal(0,1,(10,5))
st_change

在这里插入图片描述
这样的数据形式很难看到存储的是什么样的数据,并且也很难获取相应的数据,比如需要获取某个指定股票的数据,就很难去获取!!

  • 让数据更有意义的显示
    给股票涨跌幅数据增加行列索引,显示效果更佳
# 使用Pandas中的数据结构
st_change = pd.DataFrame(st_change)
st_change

在这里插入图片描述

  • 增加行索引
    错误写法:以下书写的代码可能会出现全Nan值
# 错误
# 构造行索引序列
st_code = ['股票'+str(i) for i in range(st_change.shape[0])]
print(st_code)
# 添加行索引
data = pd.DataFrame(st_change, index=st_code)
data

在这里插入图片描述
正确写法:
方法1:对dataframe结构的行索引index直接更改,有可能出问题,取决于赋什么值。以前这样做可以,现在不太推荐了

print(st_change.shape)
print(st_change.shape[0])
print(st_change.shape[1])
# 构造行索引序列
st_code = ['股票'+ str(i) for i in range(st_change.shape[0])]
print(st_code)

# 添加行索引
data = pd.DataFrame(st_change)
data.index = st_code
data

在这里插入图片描述
方法2:用rename方法改
df.rename(index={原行索引名:替换行索引名})

待增加
  • 增加列索引
    股票的日期是一个时间的序列,我们要实现从前往后的时间还要考虑每月的总天数等,不方便。使用pd.date_range():用于生成一组连续的时间序列(暂时了解)
date_range(start=None,end=None, periods=None, freq='B')
start:开始时间
end:结束时间
periods:时间天数
freq:递进单位,默认1天,'B'默认略过周末
# 生成一个时间的序列,略过周末非交易日

以下是错误代码,和上面可能出现错误的写法一样,全体nan值

# 生成一个时间的序列,略过周末非交易日
date = pd.date_range('2017-01-01', periods=stock_change.shape[1], freq='B')
# index代表行索引,columns代表列索引
data = pd.DataFrame(stock_change, index=stock_index, columns=date)

正确代码

# 增加列索引
# 股票的日期是一个时间的序列,我们要实现从前往后的时间还要考虑每月的总天数等,不方便。使用
# pd.date_range():用于生成一组连续的时间序列(暂时了解)

# 生成一个时间的序列,略过周末非交易日
date = pd.date_range('2017-01-01',periods=st_change.shape[1],freq='B')

# index代表行索引,columns代表列索引
data = pd.DataFrame(st_change)

data.columns = date

data

在这里插入图片描述

1.4 DataFrame

1.4.1 DataFrame结构

DataFrame对象既有行索引,又有列索引

  • 行索引,表明不同行,横向索引,叫index
  • 列索引,表名不同列,纵向索引,叫columns
    在这里插入图片描述

1.4.2 DatatFrame的常用属性和方法

常用属性:

  • shape
    numpy的array结构和pandas的dataframe结构一样都可以调用查看shape属性
data.shape

在这里插入图片描述

  • index
    DataFrame的行索引列表
data.index

在这里插入图片描述

  • columns
    DataFrame的列索引列表
data.columns

在这里插入图片描述

  • values
    直接获取其中array的值
data.values

在这里插入图片描述

  • T
    转置
    转置之后实际数据并没有转置
data.T

在这里插入图片描述

常用方法:

  • info()
    查看各列数据的数据类型
st1.info()

在这里插入图片描述

  • astype(np.float)
    列数据类型转换
    • 由于错误值的存在,已经将整列的数据类型变成了object字符串类型不能使用fillna()方法来替换

但是要给原数据增加个新列,把修改后的列赋值过去,删除旧列,或者直接用新列覆盖旧列,然后才能用fillna方法进行替换,如以下代码

st1['close'] = st1['close'].astype(np.float)

st1['close'].fillna(st1['close'].mean(),inplace=True)

在这里插入图片描述
值改了过来

  • head(5):显示前5行内容
    如果不补充参数,默认5行。填入参数N则显示前N行
data.head(5)

在这里插入图片描述

  • tail(5):显示后5行内容
    如果不补充参数,默认5行。填入参数N则显示后N行
data.tail(5)

在这里插入图片描述

1.4.3 DatatFrame索引的设置

修改行列索引值

注意:以下修改方式是错误的

错误写法1

# 错误修改方式
data.index[3] = '股票_3'
#报错: TypeError: Index does not support mutable operations

在这里插入图片描述
错误写法2:

# 错误
# 构造行索引序列
st_code = ['股票'+str(i) for i in range(st_change.shape[0])]
print(st_code)
# 添加行索引
data = pd.DataFrame(st_change, index=st_code)
data

在这里插入图片描述

正确的方式:
写法1:对dataframe结构的行索引index直接更改,有可能出问题,取决于赋什么值。以前这样做可以,现在不太推荐了

stock_code = ["股票_" + str(i) for i in range(stock_change.shape[0])]
# 必须整体全部修改
data.index = stock_code

在这里插入图片描述
写法2:用rename方法改
df.rename(index={原行索引名:替换行索引名})

data5 = np.random.normal(0,1,(10,5))
data5 = pd.DataFrame(data5)
data5.rename(index={0:1,2:22})

在这里插入图片描述

重设索引

  • reset_index(drop=False)
    • 设置新的下标索引
    • drop:默认为False,不删除原来索引,如果为True,删除原来的索引值
# 重置索引,drop=False
# 增加了列索引
data.reset_index()

在这里插入图片描述

# 重置索引,drop=True
# 删掉原来的行索引
data.reset_index(drop=True)

在这里插入图片描述

  • 以某列值设置为新的索引
    set_index(keys,drop=True)
    • keys : 列索引名成或者列索引名称的列表
    • drop : boolean, default True.当做新的索引,删除原来的列

设置新索引案例

# 以某列值设置为新的索引
df = pd.DataFrame({'month': [1, 4, 7, 10],
'year': [2012, 2014, 2013, 2014],
'sale':[55, 40, 84, 31]})
print(df)

# 以月份设置新的索引
df.set_index('month')

# 设置多个索引,以年和月份
df.set_index(['year','month'])

在这里插入图片描述
注:通过刚才的设置,这样DataFrame就变成了一个具有MultiIndex的DataFrame。

1.6 Series结构

在这里插入图片描述

  • series结构只有行索引
    我们获取’股票0’的所有数据(可能要转置)
data 

# series
data['股票0']
type(data['股票0'])

# 这一步相当于是series去获取行索引的值
data
data['股票0']['2017-01-02']

在这里插入图片描述

1.6.1 创建series

通过已有数据创建

  • 指定内容,默认索引
# 创建series
# 指定内容,默认索引
pd.Series(np.arange(10))

在这里插入图片描述

  • 指定索引
# 创建series
# 指定索引
pd.Series([6.7, 5.6, 3, 10, 2], index=[1, 2, 3, 4, 5])

在这里插入图片描述

  • 通过字典数据创建
# 创建series
# 通过字典数据创建
pd.Series({'red':100, 'blue':200, 'green': 500, 'yellow':1000})

在这里插入图片描述

1.6.2 series获取索引和值

  • index
  • values
data3 = pd.Series({'red':100, 'blue':200, 'green': 500, 'yellow':1000})

print(data3.index)
print(data3.values)

在这里插入图片描述

1.7 小结

  • pandas的三种数据结构
    • DataFrame结构
    • Series结构
    • index索引对象


pandas库简介(1)–pandas的三种数据结构https://blog.csdn.net/zby1001/article/details/54234121

2 基本数据操作

2.1 索引操作

Numpy当中我们已经讲过使用索引选取序列和切片选择,pandas也支持类似的操作,也可以直接使用列名、行名称,甚至组合使用

2.1.1 直接使用行列索引(先列后行)

# 2 基本数据操作
# 2.1 索引操作
# 2.1.2 结合loc或者iloc使用索引

# 使用loc:只能指定行列索引的名字
data5.loc[1:3,4]
data5.loc[1:3,2:4]

在这里插入图片描述

2.1.2 结合loc或者iloc使用索引

# 2 基本数据操作
# 2.1 索引操作
# 2.1.2 结合loc或者iloc使用索引

# 使用loc:只能指定行列索引的名字
data5.loc[1:3,4] 
data5.loc[1:3,2:4]
data5.loc[[1,3],[2,4]]

在这里插入图片描述

# 2 基本数据操作
# 2.1 索引操作
# 2.1.2 结合loc或者iloc使用索引

# 使用iloc可以通过索引的下标去获取
data5.iloc[0:8,4:5]  # 得到一列
data5.iloc[0:8,3:6]  
data5.iloc[[1,3],[2,3]]  

在这里插入图片描述

2.1.3 使用ix组合索引(已官方弃用)

已经被弃用

2.2 赋值操作

# 2.2 赋值操作

# 直接修改原来的值
data5[1] = 4
data5

在这里插入图片描述

2.3 排序

排序有两种形式,一种对内容进行排序,一种对索引进行排序

DataFrame排序

  • 使用df.sort_values(key=, ascending=)对内容进行排序
    • 单个键或者多个键进行排序,默认升序
    • ascending=False:降序
    • ascending=True:升序
# 2.3 排序
# DataFrame排序

# 按照涨跌幅大小进行排序 , 使用ascending指定按照大小排序
data6 = data5.sort_values(by=3,ascending=False).head()
data6

在这里插入图片描述

# 2.3 排序
# DataFrame排序

# 按照多个键进行排序
data7 = data5.sort_values(by=[2,4])
data7

在这里插入图片描述

  • 使用sort_index对索引进行排序
# 2.3 排序
# DataFrame排序
# 使用sort_index对索引进行排序

# 对索引进行排序
data7.sort_index()

在这里插入图片描述

Series

  • 使用series.sort_values(ascending=True)对内容进行排序

series排序时,只有一列,不需要参数

data5[4]
type(data5[4]) # pandas.core.series.Series

data5[4].sort_values(ascending=True).head()

在这里插入图片描述

  • 使用series.sort_index()对索引进行排序
    与df一致
data5[4].sort_index()

在这里插入图片描述

2.4 总结

  • 索引操作,loc和iloc
  • 赋值操作
  • sort_values对内容进行排序
  • sort_index对索引进行排序

3 DataFrame运算

3.1 算术运算

  • add(other) # 加
    比如进行数学运算加上具体的一个数字
# 3 DataFrame运算
# 3.1 算术运算

data5[1].add(1)

在这里插入图片描述

  • sub(other) # 减
    求差
# 3 DataFrame运算
# 3.1 算术运算

data5
# 1、筛选两列数据
st = data5[0]
end = data5[1]

# 相减
data5[5] = end.sub(st)
data5

在这里插入图片描述

  • add()、sub()、mul()和div()分别表示加减乘除(注意乘法是对应元素相乘,而不是矩阵乘法)
# 3 DataFrame运算
# 3.1 算术运算

# 乘
first = data5[1]
second = data5[2]

data5['乘'] = first.mul(second)
data5

在这里插入图片描述

# 3 DataFrame运算
# 3.1 算术运算

# 除
first = data5[1]
second = data5[2]

data5['除'] = second.div(first)
data5

在这里插入图片描述

3.2 逻辑运算

3.2.1 逻辑运算符号<、 >、|、 &

筛选单个结果

# 3.2 逻辑运算
# 3.2.1 逻辑运算符号<、 >、|、 &

# 逻辑判断的结果可以作为筛选的依据
print(data5[2] > 0.5)

print(data5[data5[2]>0.5])

在这里插入图片描述

完成多个逻辑判断

  • 与判断 &
# 3.2 逻辑运算
# 3.2.1 逻辑运算符号<、 >、|、 &

data5[(data5[4]>0.1)&(data5[5]<4)]

在这里插入图片描述

  • 或判断
# 3.2 逻辑运算
# 3.2.1 逻辑运算符号<、 >、|、 &

data5[(data5[4]>0.1)|(data5[5]<4)]

在这里插入图片描述

3.2.2 逻辑运算函数

  • query(expr)
    • expr:查询字符串

通过query使得刚才的过程更加方便简单

# 3.2 逻辑运算
# 3.2.2 逻辑运算函数
data5.query("乘>0 | 除>0")

在这里插入图片描述

  • isin(values)
# 3.2 逻辑运算
# 3.2.2 逻辑运算函数

data5[data5[1].isin([4])]

在这里插入图片描述

3.3 统计运算

3.3.1 describe()

综合分析: 能够直接得出很多统计结果, count , mean , std , min , max 等

# 3.3 统计运算
# 3.3.1 describe()

# 计算平均值、标准差、最大值、最小值
data5.describe()

在这里插入图片描述

3.3.2 统计函数

Numpy当中已经详细介绍,在这里我们演示min(最小值), max(最大值), mean(平均值), median(中位数), var(方差), std(标准差)结果

附上numpy的学习地址:
python使用numpy模块的介绍,基本操作,处理数据,包括生成数组,正态分布,均匀数组,数值改变,索引切片,形状修改,类型修改,数组去重,值运算,数组运算,合并分割,IO操作(读取)https://blog.csdn.net/weixin_55579895/article/details/120687601?spm=1001.2014.3001.5502

在这里插入图片描述
在这里插入图片描述
对于单个函数去进行统计的时候,坐标轴还是按照这些默认为“columns” (axis=0, default),如果要对行“index” 需要指定(axis=1)

  • max()、min()
# 3.3 统计运算
# 3.3.2 统计函数

# 使用统计函数:0 代表列求结果, 1 代表行求统计结果
data5.max()

在这里插入图片描述

  • std()、var()
# 3.3 统计运算
# 3.3.2 统计函数

# 方差
data5.var(1)

在这里插入图片描述

# 3.3 统计运算
# 3.3.2 统计函数

# 标准差
data5.std()

在这里插入图片描述

  • median():中位数
    中位数为将数据从小到大排列,在最中间的那个数为中位数。如果没有中间数,取中间两个数的平均值。
# 3.3 统计运算
# 3.3.2 统计函数

# 中位数
data5.median(0)

在这里插入图片描述

  • idxmax() # 求出最大值的位置、idxmin() # 求出最小值的位置
# 3.3 统计运算
# 3.3.2 统计函数

data5.idxmax(0)
data5.idxmax(axis=0)

在这里插入图片描述

# 3.3 统计运算
# 3.3.2 统计函数

data5.idxmin(0)
data5.idxmin(axis=0)

在这里插入图片描述

3.4 累计统计函数

函数作用
cumsum计算前1/2/3/…/n个数的和(值一个个累计上去)
cummax计算前1/2/3/…/n个数的最大值
cummin计算前1/2/3/…/n个数的最小值
cumprod计算前1/2/3/…/n个数的积

以上这些函数可以对series和dataframe操作
这里我们按照时间的从前往后来进行累计

# 3.4 累计统计函数

# 排序
data8 = data5.sort_index()

# 求和
st_0 = data8[0]
st_0.cumsum()
# data8

在这里插入图片描述
使用plot函数画出图像

import matplotlib.pyplot as plt
# plot显示图形
st_0.cumsum().plot()
# 需要调用show,才能显示出结果
plt.show()

在这里插入图片描述

3.5 自定义运算

  • apply(func, axis=0)
    • func:自定义函数
    • axis=0:默认是列,axis=1为行进行运算

案例:定义一个对列,最大值-最小值的函数

# 3.5 自定义运算

data5[[0,1]].apply(lambda x: x.max() - x.min(),axis=1)

在这里插入图片描述

4 Pandas画图

4.1 pandas.DataFrame.plot

  • DataFrame.plot (x=None, y=None, kind=‘line’)
    • x : label or position, default None
    • y : label, position or list of label, positions, default None
      • Allows plotting of one column versus another
    • kind : str
      • ‘line’ : line plot (default)
      • ‘bar’ : vertical bar plot
      • ‘barh’ : horizontal bar plot
      • ‘hist’ : histogram
      • ‘pie’ : pie plot
      • ‘scatter’ : scatter plot

更多参数细节:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFram
e.plot.html?highlight=plot#pandas.DataFrame.plot

4.2 pandas.Series.plot

更多参数细节:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.plo
t.html?highlight=plot#pandas.Series.plot

5 文件读取与存储

我们的数据大部分存在于文件当中,所以pandas会支持复杂的IO操作,pandas的API支持众多的文件格式,如CSV、SQL、XLS、JSON、HDF5。
注:最常用的HDF5和CSV文件

5.1 CSV

5.1.1 读取csv文件-read_csv

  • pandas.read_csv(filepath_or_buffer, sep =’,’ , delimiter = None)
    • filepath_or_buffer:文件路径
    • usecols:指定读取的列名,列表形式
### 5.1 CSV
### 5.1.1 读取csv文件-read_csv

# 读取文件,并且指定
data9 = pd.read_csv('stock_day.csv',usecols=['open','high','close'])
data9

在这里插入图片描述

5.1.2 写入csv文件-to_csv

  • DataFrame.to_csv (path_or_buf=None, sep=’, ’, columns=None, header=True, index=True,
    index_label=None, mode=‘w’, encoding=None)
    • path_or_buf :string or file handle, default None
    • sep :character, default ‘,’
    • columns :sequence, optional
    • mode:‘w’:重写, ‘a’ 追加
    • index:是否写进行索引
    • header :boolean or list of string, default True,是否写进列索引值
  • Series.to_csv (path=None, index=True, sep=’, ‘, na_rep=’’, float_format=None, header=False,
    index_label=None, mode=‘w’, encoding=None, compression=None, date_format=None,
    decimal=’.’)
    • Write Series to a comma-separated values (csv) file
### 5.1 CSV
# 5.1.2 写入csv文件-to_csv

# 保存'open'列的数据
data9
# 选取10行数据保存,便于观察数据
data9[:10].to_csv('test1.csv',columns=['open'])

在这里插入图片描述
读取,查看结果

### 5.1 CSV
# 5.1.2 写入csv文件-to_csv

# 保存'open'列的数据
data9
# 选取10行数据保存,便于观察数据
data9[:10].to_csv('test1.csv',columns=['open'])

# 读取,查看结果
# 读取前先将打开检查的文件关闭否则报错 # [Errno 13] Permission denied: 'test1.csv'
pd.read_csv('test1.csv')

在这里插入图片描述
会发现将索引存入到文件当中,变成单独的一列数据。如果需要删除,可以指定index参数,删除原来的文件,重新保存一次。

# 会发现将索引存入到文件当中,变成单独的一列数据。如果需要删除,可以指定index参数,删除原来的文件,重新保存一次。

# index:存储不会将索引值变成一列数据
data9[:10].to_csv('test2.csv',columns=['open'],index=False)

在这里插入图片描述

  • 指定追加方式
# 指定追加方式

data9[:10].to_csv('test2.csv',columns=['open'],index=False,mode='a')

在这里插入图片描述
又存进了一个列名,所以当以追加方式添加数据的时候,一定要去掉列名columns,指定header=False

# 又存进了一个列名,所以当以追加方式添加数据的时候,一定要去掉列名columns,指定header=False

data9[:10].to_csv('test2.csv',columns=['open'],index=False,mode='a',header=False)

在这里插入图片描述

5.2 HDF5

5.2.1 read_hdf与to_hdf

HDF5文件的读取和存储需要指定一个键,值为要存储的DataFrame

  • pandas.read_hdf(path_or_buf,key =None,** kwargs)

从h5文件当中读取数据

-path_or_buffer:文件路径
-key:读取的键
-mode:打开文件的模式
-return:Theselected object
  • DataFrame.to_hdf (path_or_buf, key, **kwargs)

案例

  • 读取文件
# 5.2 HDF5
# 5.2.1 read_hdf与to_hdf
# 读取文件

day_high = pd.read_hdf('day_high.h5')
day_high

在这里插入图片描述
如果读取的时候出现以下错误
在这里插入图片描述
需要安装安装tables模块避免不能读取HDF5文件

pip install tables

在这里插入图片描述

  • 存储文件
# 5.2 HDF5
# 5.2.1 read_hdf与to_hdf
# 读取文件

day_high = pd.read_hdf('day_high.h5')
day_high

在这里插入图片描述

再次读取的时候, 需要指定键的名字

day_high.to_hdf('test.h5',key='day_high')

# 再次读取的时候, 需要指定键的名字
new_high = pd.read_hdf('test.h5',key='day_high')
new_high

在这里插入图片描述

5.3 JSON

Json是我们常用的一种数据交换格式,前面在前后端的交互经常用到,也会在存储的时候选择这种格式。所以我们需要知道Pandas如何进行读取和存储JSON格式。

5.3.1 read_json

  • pandas.read_json(path_or_buf=None, orient=None, typ=‘frame’, lines=False)
    • 将JSON格式准换成默认的Pandas DataFrame格式
    • orient : string,Indication of expected JSON string format.
      • ‘split’ : dict like {index -> [index], columns -> [columns], data -> [values]}
      • ‘records’ : list like [{column -> value}, … , {column -> value}]
      • ‘index’ : dict like {index -> {column -> value}}
      • ‘columns’ : dict like {column -> {index -> value}},默认该格式
      • ‘values’ : just the values array
    • lines : boolean, default False
      • 按照每行读取json对象
    • typ : default ‘frame’, 指定转换成的对象类型series或者dataframe

案例

Sarcasm_Headlines_Dataset.json

  • 数据介绍
    这里使用一个新闻标题讽刺数据集,格式为json。 is_sarcastic :1讽刺的,否则为0; headline :新闻报道的标题; article_link :链接到原始新闻文章。存储格式为:
    在这里插入图片描述
  • 读取
    orient指定存储的json格式,lines指定按行作为一个样本
# 5.3.1 read_json

json_read = pd.read_json('Sarcasm_Headlines_Dataset.json',orient='records',lines=True)
json_read

在这里插入图片描述

5.3.2 to_json

  • DataFrame.to_json(path_or_buf=None,orient=None,lines=False)
    将Pandas 对象存储为json格式
    path_or_buf=None:文件地址
    orient:存储的json形式,{‘split’,’records’,’index’,’columns’,’values’}
    lines:一个对象存储为一行

案例

  • 存储文件
# 5.3.2 to_json

json_read.to_json('test.json',orient='records')

在这里插入图片描述

  • 修改lines参数为True
# 修改lines参数为True

json_read.to_json('test.json',orient='records',lines=True)

在这里插入图片描述

5.4 拓展

优先选择使用HDF5文件存储

  • HDF5在存储的是支持压缩,使用的方式是blosc,这个是速度最快的也是pandas默认支持的
  • 使用压缩可以提磁盘利用率,节省空间
  • HDF5还是跨平台的,可以轻松迁移到hadoop 上面

6 高级处理-缺失值处理

在这里插入图片描述

6.1 如何处理nan

对于NaN的数据,在numpy中我们是如何处理的?在pandas中我们处理起来非常容易

  • 判断数据是否为NaN:pd.isnull(df),pd.notnull(df)
    处理方式:
  • 存在缺失值nan,并且是np.nan:
    • 1、删除存在缺失值的:dropna(axis=‘rows’)
      • 注:不会修改原数据,需要接受返回值
    • 2、替换缺失值:fillna(value, inplace=True)
      • value:替换成的值
      • inplace:True:会修改原数据,False:不替换修改原数据,生成新的对象
  • 不是缺失值nan,有默认标记的

6.2 电影数据的缺失值处理

电影数据文件获取

# 6 高级处理-缺失值处理
# 6.2 电影数据的缺失值处理

# 读取电影数据
st = pd.read_csv('pandas_day.csv')
st

在这里插入图片描述

6.2.1 判断缺失值是否存在

  • pd.notnull()
  • pd.isnull()
# 6.2.1 判断缺失值是否存在
pd.notnull(st)

在这里插入图片描述

6.2.2 存在缺失值nan,并且是np.nan

1、删除

pandas删除缺失值,使用dropna的前提是,缺失值的类型必须是np.nan

# 6.2.2 存在缺失值nan,并且是np.nan

# 删除
# 不修改原数
st.dropna()

# 可以定义新的变量接受或者用原来的变量名
st1 = st.dropna()
st1

在这里插入图片描述

6.2.2 存在缺失值nan,并且是np.nan

# 2、替换缺失值
# 替换存在缺失值的样本
# 替换填充平均值,中位数
st['high'].fillna(st['high'].mean(),inplace=True)
st

在这里插入图片描述

6.2.3 不是缺失值nan,有默认标记的

数据是这样的:
在这里插入图片描述

处理思路分析:

  • 1、先替换‘?’为np.nan
    • df.replace(to_replace=, value=)
      • to_replace:替换前的值
      • value:替换后的值
# 6.2.3 不是缺失值nan,有默认标记的

st = st.replace(to_replace='��',value=np.nan)
st

在这里插入图片描述

  • 2、进行缺失值的处理
    目前发现对缺失值的处理不能使用fillna替换,查看修改成nan值之后的整份文件的每一列数据的mean()时,无法查阅到close列的mean()值

在这里插入图片描述
由于错误值的存在,已经将整列的数据类型变成了object字符串类型不能使用fillna()方法来替换
在这里插入图片描述

方法1:直接删除

# 6.2.3 不是缺失值nan,有默认标记的

st1 = st.replace(to_replace='��',value=np.nan)
st1.mean()
st1

# 2、在进行缺失值的处理
# 删除
st2 = st1.dropna()
st2

在这里插入图片描述
方法2:使用列数据类型转换方法

  • astype(np.float)
    给原数据增加个新列,把修改后的列赋值过去,删除旧列,或者直接用新列覆盖旧列

先看前者,增加新的列

st1['colse1'] = st1['close'].astype(np.float)
st1.info()

在这里插入图片描述
然后令旧的列等于该列即可,我们直接用新列覆盖旧列

# 6.2.3 不是缺失值nan,有默认标记的

st1 = st.replace(to_replace='��',value=np.nan)
# st1.mean()
st1.info()

# 2、在进行缺失值的处理
# 转整列格式
# 直接用新列覆盖旧列
st1['close'] = st1['close'].astype(np.float)
st1.info()

在这里插入图片描述

再使用fillna进行值的转换,修改成功

st1['close'].fillna(st1['close'].mean(),inplace=True)
st1

在这里插入图片描述

7 高级处理-数据离散化

7.1 什么是数据的离散化

连续属性的离散化就是将连续属性的值域上,将值域划分为若干个离散的区间,最后用不同的符号或整数 值代表落在每个子区间中的属性值。
离散化有很多种方法,这使用一种最简单的方式去操作

  • 原始的身高数据:165,174,160,180,159,163,192,184
  • 假设按照身高分几个区间段:(150, 165], (165, 180], (180, 195]

这样我们将数据分到了三个区间段,我可以对应的标记为矮、中、高三个类别,最终要处理成一个“哑变量”矩阵。
在这里插入图片描述

7.2 为什么要离散化

连续属性离散化的目的是为了简化数据结构,数据离散化技术可以用来减少给定连续属性值的个数。离散化方法经常作为数据挖掘的工具。

7.3 如何实现数据的离散化

案例:股票的涨跌幅离散化
我们对股票每日的"p_change"进行离散化

7.3.1 读取股票的数据

先读取股票的数据,筛选出p_change数据

# 7.3 如何实现数据的离散化
d1 = pd.read_csv('stock_day.csv')
d1

在这里插入图片描述

7.3.2 将股票涨跌幅数据进行分组

在这里插入图片描述
使用的工具:

  • pd.qcut(data, bins):
    对数据进行分组将数据分组 一般会与value_counts搭配使用,统计每组的个数
  • series.value_counts():统计分组次数

自行分组

# 自行分组
qcut = pd.qcut(p_change,10)
# qcut
# 计算分到每个组数据个数
qcut.value_counts()

在这里插入图片描述

# 自行分组
qcut = pd.qcut(p_change,10)
qcut

直接输出qcut的内容会显示区间
在这里插入图片描述

自定义区间分组:

  • pd.cut(data, bins)
# 自己指定分组区间
bins = [-100, -7, -5, -3, 0, 3, 5, 7, 100]
qcut1 = pd.cut(p_change,bins)
qcut1.value_counts()

在这里插入图片描述

7.3.3 股票涨跌幅分组数据变成one-hot编码

  • pandas.get_dummies(data, prefix=None)
    • data:array-like, Series, or DataFrame
    • prefix:分组名字
du = pd.get_dummies(qcut,prefix='focus')
du

在这里插入图片描述

8 高级处理-合并

如果你的数据由多张表组成,那么有时候需要将不同的内容合并在一起分析

8.1 pd.concat实现数据合并

  • pd.concat([data1, data2], axis=1)
    • 按照行或列进行合并,axis=0为列索引,axis=1为行索引

比如我们将刚才处理好的one-hot编码与原数据合并

# 8.1 pd.concat实现数据合并

pd.concat([d1,du],axis=1)

在这里插入图片描述
如果按列索引合并,可以发现有nan值

# 8.1 pd.concat实现数据合并

pd.concat([d1,du],axis=0)

在这里插入图片描述

8.2 pd.merge

  • pd.merge(left, right, how=‘inner’, on=None, left_on=None, right_on=None,left_index=False,
    right_index=False, sort=True,suffixes=(‘x’, ‘y’), copy=True, indicator=False,validate=None)
    • 可以指定按照两组数据的共同键值对合并或者左右各自
    • left : A DataFrame object
    • right : Another DataFrame object
    • on : Columns (names) to join on. Must be found in both the left and right DataFrame objects.
    • left_on=None, right_on=None:指定左右键

在这里插入图片描述

  • 内连接(默认)
    只有相同的才给你做连接

如图中left的key1,key2和right的两行关联了两次,就将left的这一行复制一次变成两行
在这里插入图片描述

# 8.2.1 pd.merge合并

left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
'key2': ['K0', 'K1', 'K0', 'K1'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
'key2': ['K0', 'K0', 'K0', 'K0'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
# 默认内连接
result = pd.merge(left, right, on=['key1', 'key2'])
left
right
result

在这里插入图片描述

  • 左连接
    前者有的,后者必须要有,否则后者自行补齐(补nan值)

如图所示,第一行key值全部匹配直接合并,第二行key不匹配直接输出并补全nan值,第三行有两次相同的key值则复制一行填充
在这里插入图片描述

# 左连接
r2 = pd.merge(left,right,how='left',on=['key1','key2'])
r2

在这里插入图片描述

  • 右连接
    意思和左连接相反
    在这里插入图片描述
# 右连接

result = pd.merge(left, right, how='right', on=['key1', 'key2'])
result

在这里插入图片描述

  • 外链接
    和内连接相反,但有一点不同的就是要所有数值都要有,匹配失败的地方用nan值补齐
    在这里插入图片描述
# 外连接

result = pd.merge(left, right, how='outer', on=['key1', 'key2'])
result

在这里插入图片描述

8.3 总结

  • concat进行按照索引的合并
  • merge进行按照键合并
  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章           查看所有文章
加:2021-10-14 08:13:30  更:2021-10-14 08:13:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 10:28:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码