(三) 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
练习:
-
假设ddd是期中考试成绩,ddd2是期末考试成绩,请自由创建ddd2,并将其与ddd相加,求期中期末平均值。
-
假设张三期中考试数学被发现作弊,要记为0分,如何实现?
-
李四因为举报张三作弊立功,期中考试所有科目加100分,如何实现?
-
后来老师发现有一道题出错了,为了安抚学生情绪,给每位学生每个科目都加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. 老师决定根据用数学的分数填充张三的英语成绩,如何实现? 用李四的英语成绩填充张三的英语成绩?
作者:TigerLee
出处:http://www.cnblogs.com/tiger666/
本文版权归作者和博客园所有,欢迎转载。转载请在留言板处留言给我,且在文章标明原文链接,谢谢!
如果您觉得本篇博文对您有所收获,觉得我还算用心,请点击右下角的 [推荐],谢谢!