(三) Pandas之DataFrame01

DataFrame

DataFrame是一个【表格型】的数据结构。DataFrame由按一定顺序排列的多列数据组成。设计初衷是将Series的使用场景从一维拓展到多维。DataFrame既有行索引,也有列索引。

  • 行索引:index
  • 列索引:columns
  • 值:values

一.DataFrame的创建

    - 最常用的方法是传递一个字典来创建。DataFrame以字典的键作为每一【列】的名称,以字典的值(一个数组)作为每一列。使用字典创建的DataFrame后,则columns参数将不可被使用。

    - 同Series一样,若传入的列与字典的键不匹配,则相应的值为NaN。

dic = {
    'java':[60,70,80],
    'python':[100,100,100]
}
#data为数据源,index为行索引,column为列索引
DataFrame(data=dic,index=['zhangsan','lisi','wangwu'])

 使用numpy数组创建DataFrame

DataFrame(data=np.random.randint(60,100,size=(3,3)),index=['a','b','c'],columns=['A','B','C'])

DataFrame属性:values、columns、index、shape

练习:

根据以下考试成绩表,创建一个DataFrame,命名为df:

    张三  李四  
语文 150  0
数学 150  0
英语 150  0
理综 300  0

二.DataFrame的索引

(1) 对列进行索引

- 通过类似字典的方式  df['q']
- 通过属性的方式     df.q

可以将DataFrame的列获取为一个Series。返回的Series拥有原DataFrame相同的索引,且name属性也已经设置好了,就是相应的列名。

#修改指定的列
df['li'] = [1,2,3,4]
#获取前两列
df[['zhangsan','li']]

(2) 对行进行索引

- 使用.loc[]加index来进行行索引
- 使用.iloc[]加整数来进行行索引

同样返回一个Series,index为原来的columns。

#获取math对应的行数据
df.loc['math']
#使用隐式索引获取指定的行数据
df.iloc[1]
df.iloc[[1,0]]

(3) 对元素索引的方法

- 使用列索引
- 使用行索引(iloc[3,1] or loc['C','q']) 行索引在前,列索引在后
#获取math行张三列对应的数据值
df.loc['math','zhangsan']

三.DataFrame的切片

【注意】 直接用中括号时:

  • 索引表示的是列索引
  • 切片表示的是行切片
#切行:从math切到lizong
df['math':'lizong']

在loc和iloc中使用切片(切列) : df.loc['B':'C','丙':'丁']

df.loc[:,'zhangsan':'li']

四.DataFrame的运算

(1) DataFrame之间的运算

同Series一样:

  • 在运算中自动对齐不同索引的数据
  • 如果索引不对应,则补NaN

练习:

  1. 假设ddd是期中考试成绩,ddd2是期末考试成绩,请自由创建ddd2,并将其与ddd相加,求期中期末平均值。

  2. 假设张三期中考试数学被发现作弊,要记为0分,如何实现?

  3. 李四因为举报张三作弊立功,期中考试所有科目加100分,如何实现?

  4. 后来老师发现有一道题出错了,为了安抚学生情绪,给每位学生每个科目都加10分,如何实现?

五.处理丢失值

有两种丢失数据:

  • None
  • np.nan(NaN)

1. None

None是Python自带的,其类型为python object。因此,None不能参与到任何计算中。

#查看None的数据类型
type(None)

None + 1  # None与数字进行运算会报错

2. np.nan(NaN)

np.nan是浮点类型,能参与到计算中。但计算的结果总是NaN。

#查看np.nan的数据类型
np.nan

type(np.nan)  # 查看类型
np.nan + 1  # nan与数字进行运算不会报错

3.pandas中None与np.nan都视作np.nan

- 需求:创建一个df,然后手动在df中设置一些控制,然后将空值对应的行进行删除。

#创建DataFrame
np.random.seed(10)
df = DataFrame(np.random.randint(50,200,size=(6,5)),index=['a','d','f','g','t','j'],columns=['D','R','G','E','M'])
#将某些数组元素赋值为nan
df.iloc[1,3] = None
df.iloc[2,2] = np.nan
df.iloc[4,2] = None
#检测空值所在的行
condition = df.notnull().all(axis=1)
#过滤空值所在的行
df.loc[condition]

4.Pandas处理空值函数

isnull()  # 如果为空返回True
notnull()    # 如果非空返回True
dropna()  # 过滤丢失数据
fillna()  # 填充丢失数据

(1)判断函数

#1.进行空值检测
df.isnull()

# 使用.any()将表达式里面存在空值的行或列返回, axis为1检测行,axis为0检测列
# 规律: isnull()后面调用.any(), notnull()后面调用.all()
df.isnull().any(axis=1)

# 使用.all将全部为空值的行或列返回
df.notnull().all(axis=1)

# 将df.isnull().any(axis=1)表达式返回的布尔值作为行索引再取值,取到的是带有空值的数据
drop_index = df.loc[df.isnull().any(axis=1)].index
drop_index

# 再通过索引来删除有空值的行
df.drop(labels=drop_index, axis=0)

# 使用notnull()
df.notnull().all(axis=1)
df.loc[df.notnull().all(axis=1)].index

总结:

isnull(): True空值 False非空

notnull(): False非空 True空

如何检测df中哪些行中存在空值?

  df.isnull().any(axis=1): True为空 False非空

  df.notnull().all(axis=1): True为非空 True为空

 

(2) df.dropna() 可以选择过滤的是携带空值的行还是列(默认为行):axis中0表示行,1表示的列。inplace是将该操作替换会源数据中

df.dropna(axis=0,inplace=True)  #在drop系列的函数中,轴向的参数值0表示的是行,1表示的是列

(3) 填充函数 Series/DataFrame:fillna() value和method参数

np.random.seed(10)
df = DataFrame(np.random.randint(50,200,size=(6,5)),index=['a','d','f','g','t','j'],columns=['D','R','G','E','M'])
#将某些数组元素赋值为nan
df.iloc[1,3] = None
df.iloc[2,3] = None
df.iloc[2,2] = np.nan
df.iloc[4,2] = None
#使用填充函数对df中的空值进行填充
#method参数表示填充的形式:ffill向前填充,bfill向后填充(就是用空值紧邻的值填充该空值)
df.fillna(method='bfill',axis=0,limit=1)

df.fillna(method='bfill', axis=0)  # bfill表示用后面的数值填充(向后)
df.fillna(method='bfill', axis=1)  # bfill表示用后面的数值填充(向后)
df.fillna(method='ffill', axis=0)  # 连续三个空值的使用向前填充就无法完成了
df.fillna(method='bfill', axis=0)  # 所以应该使用向后填充, 用bfill

面试题空值清洗:

数据说明:
数据是1个冷库的温度数据,1-7对应7个温度采集设备,1分钟采集一次。

数据处理目标:
用1-4对应的4个必须设备,通过建立冷库的温度场关系模型,预估出5-7对应的数据。
最后每个冷库中仅需放置4个设备,取代放置7个设备。
f(1-4) --> y(5-7)

数据处理过程:
1、原始数据中有丢帧现象,需要做预处理;
2、matplotlib 绘图;
3、建立逻辑回归模型。

无标准答案,按个人理解操作即可,请把自己的操作过程以文字形式简单描述一下,谢谢配合。

import pandas as pd
from pandas import Series, DataFrame

df = pd.read_excel('./测试数据.xlsx')  # 读取测试数据文件
df.drop(labels=['none', 'none1'], axis=1, inplace=True)  # 删除无用的空列
# 手动删除空行
df.isnull().any(axis=1)
indexs = ~(df.isnull().any(axis=1))  # 使用~取反
new_df = df.loc[indexs]
len(new_df['time'])  # 查看剩余数据个数

# 使用dropna()方法直接删除空值对应的行
df.dropna(axis=0)

# 填充
new_df = df.fillna(method='bfill', axis=0).fillna(method='ffill', axis=0)

# 使用相关机制检测哪些列中存在空
new_df.isnull().any(axis=0)

 

 

练习:

1. 简述None与NaN的区别

2. 假设张三李四参加模拟考试,但张三因为突然想明白人生放弃了英语考试,因此记为None,请据此创建一个DataFrame,命名为ddd3

3. 老师决定根据用数学的分数填充张三的英语成绩,如何实现? 用李四的英语成绩填充张三的英语成绩?

 

posted @ 2019-07-10 16:08  tiger_li  阅读(720)  评论(0编辑  收藏  举报