;a","b","c","d"])
df
#output
aa bb cc dd
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
d 12 13 14 15
#制造NaN值
df.loc[:1,:]=np.nan
print (df)
#output
aa bb cc dd
a NaN NaN NaN NaN
b 4.0 5.0 6.0 7.0
c 8.0 9.0 10.0 11.0
d 12.0 13.0 14.0 15.0
print (df.dropna(axis=1,how="all")) #0行1列
#output 并没有发生变化,因为过滤的是列,要求一列全都是NaN值
#output
aa bb cc dd
a NaN NaN NaN NaN
b 4.0 5.0 6.0 7.0
c 8.0 9.0 10.0 11.0
d 12.0 13.0 14.0 15.0
df.dropna(axis=0,how="all") #0行1列
#output
aa bb cc dd
b 4.0 5.0 6.0 7.0
c 8.0 9.0 10.0 11.0
d 12.0 13.0 14.0 15.0
(3)填充缺失值
因为数据处理的要求,可能并不需要将所有的数据进行过滤,此时需要对数据进行必要的填充(比如0.0);还可以用线性插值进行必要的填充,而在这个数据处理中需要用到的方式如下所示:
df=pd.DataFrame(np.arange(16).reshape((4,4)),columns=["aa","bb","cc","dd"],index = ["a","b","c","d"])
df
df.loc[:1,:] = np.nan
print (df)
#output
aa bb cc dd
a NaN NaN NaN NaN
b 4.0 5.0 6.0 7.0
c 8.0 9.0 10.0 11.0
d 12.0 13.0 14.0 15.0
print (df.fillna(0.0)) #fillna 默认会返回新的对象
#output
aa bb cc dd
a 0.0 0.0 0.0 0.0
b 4.0 5.0 6.0 7.0
c 8.0 9.0 10.0 11.0
d 12.0 13.0 14.0 15.0
#也可以像dropna 操作一样进行必要的限定而不是所有的值都进行填充
#print df.fillna({1:0.5,2:5.5) #测试失败
#当需要在旧的对象上进行更改,而不是经过过滤返回一个新的对象时
df.fillna(0.5,inplace = True)
df
#output
aa bb cc dd
a 0.5 0.5 0.5 0.5
b 4.0 5.0 6.0 7.0
c 8.0 9.0 10.0 11.0
d 12.0 13.0 14.0 15.0
#也可以选择一些线性插值进行填充
df.loc[:1,:] = np.nan
df.fillna(method ="bfill") #后向寻值填充
#output
aa bb cc dd
a 4.0 5.0 6.0 7.0
b 4.0 5.0 6.0 7.0
c 8.0 9.0 10.0 11.0
d 12.0 13.0 14.0 15.0
df.fillna(df.mean()) #使用平均值进行填充
#output
aa bb cc dd
a 8.0 9.0 10.0 11.0
b 4.0 5.0 6.0 7.0
c 8.0 9.0 10.0 11.0
d 12.0 13.0 14.0 15.0
另外,在处理缺失值时除了以上介绍的简单操作之外,更多的时候需要根据数据挖掘需要或者程序运行方面灵活地进行缺失值处理,程序是人为设定的规则,但针对这些规则进行优化组合,将会带来新的效果
3.数据库的使用
关于数据库的使用,虽然各大厂商都在追捧NOSQL,但是目前使用最多的还是关系型数据库(MySQL、SQLServer、PostgreSql等)。总体而言,数据库的选择取决于其性能、数据完整性及应用程序的需求等。
在这里我们使用python内置的sqlite3驱动器,操作过程如下所示:
#sql MySql
import sqlite3 as sql #首先我们需要导入sqlite3包
#现在我们使用的是python内置的数据库
#创建数据库表(table)
query = "create table test(a varchar(20),b varchar(20),c real,d integer);"
con = sql.connect(":memory:")
#可以看出它是内置数据库而且此处又使用memory
#因此它的处理是放在内存进行处理的内置操作
con.execute(query)
con.commit()
#对刚才创建的test表写入数据
#insert data
data = [("UCAS","NSLCAS",0.5,1),
("UCAS","NSLCAS",0.5,2),
("UCAS","NSLCAS",0.5,3),
("UCAS","NSLCAS",0.5,4)]
stmt="insert into test values(?,?,?,?)"
con.executemany(stmt,data) #多行方式写入,如果单行模式用con.execute
con.commit
#查找数据
#select data
sql_str="select*from test"
cursor=con.execute(sql_str)
rows=cursor.fetchall()
rows
#output
[('UCAS', 'NSLCAS', 0.5, 1),
('UCAS', 'NSLCAS', 0.5, 2),
('UCAS', 'NSLCAS', 0.5, 3),
('UCAS', 'NSLCAS', 0.5, 4)]
#说明:查找的数据是我们刚才写入的数据 关键的地方才正式开始:通过获取的数据rows生成DataFrame(这里是建立数据库中数据同pandas数据对象DataFrame之间关系的关键)
import pandas as pd
column =list(zip(*cursor.description))[0] #获取列名
df = pd.DataFrame(rows,columns = column)
df
#书本上写的是:column = zip(*cursor.description)[0]
#错误:'zip' object is not subscriptable
#解决办法:使用list包装zip对象
#代码:column =list(zip(*cursor.description))[0]
#注意[0]是在list的括号()外
#output
a b c d
0 UCAS NSLCAS 0.5 1
1 UCAS NSLCAS 0.