Pandas读取官方文档查阅地址 Input/Output — pandas 0.24.2 documentation (pydata.org)
read_csv\read_table(filepath_or_buffer,sep=’\t’,header=’infer’,names=None,index_col=None,usecols=None,dtype=None,converters=None,skiprows=None,skipfooter=None,nrows=None,na_values=None,skip_blank_lines=True,parse_dates=False,thousands=None,comment=None,encoding=None)
读取txt,注意到以下问题:如何忽略其他不相关内容,手动添加#;如何添加变量名称;如何避免编号中’00’的消失。
import pandas as pd data1=pd.read_table(filepath_or_buffer=r'D:\Projects\Python\Doing\pythonProject\data\data1.txt', sep=',',# 指定分隔符 header=None, # 不需要将原始数据中的第一行读作表头 names=['id','name','gender','occupation'], # 为各列起变量名称 skiprows=2, #跳过起始的两行数据 skipfooter=2, #跳过末尾的两行数据 comment='#', # 不读取'#'开头的数据行 converters={'id':str}, #对工号变量进行类型转换,避免开头的00消失 encoding='gbk' ) print(data1) ''' id name gender occupation 0 00446 张敏 女 前端工程师 1 00483 李琴 女 Java开发工程师 2 00552 赵东来 男 数据分析师 3 00589 丁顺昌 男 数据分析师 '''
read_excel(io,sheetname=0,header=0,skiprows=Nne,skip_footer=0,index_col=None,names=None,parse_cols=None,parse_dates=False,na_values=None,thousands=None,convert_float=True)
import pandas as pd data2=pd.read_excel(io=r'D:\Projects\Python\Doing\pythonProject\data\data2.xlsx', header=None, # 不需要将原始数据中的第一行读作表头 names=['id','date','prod_name','color','price'], # 为各列起变量名称 converters={'0':str}, #字典中的键必须为0,因为原始表中没有列名称 na_values='未知' # 原数据表中“未知”转换为缺失值 ) print(data2) ''' id date prod_name color price 0 23146 2016-03-18 连衣裙 237 白色 1 1344527 2017-06-12 牛仔裤 368 蓝色 2 223685 2018-02-10 皮鞋 589 NaN 3 37249 2017-07-17 寸衫 299 白色 4 368241 2016-03-23 板鞋 299 蓝色 5 1127882 2018-09-17 西装 1599 黑色 '''
读入SQL Server需要使用pymssql模块,在jupyter中输入“!pip install pymssql”;
读入MySQL需要使用Pymysql模块,在jupyter中输入“!pip install pymysql”。
然后基于两个模块各自的connect函数构建数据库与python之间的桥梁,最后在搭建好连接的基础上使用pandas模块中的read_sqll函数实现数据库数据的读取。
1.connect函数
(1)pymssql.connect(server=None,user=None,password=None,database=Nonesharset=None)
(2)pymysql.connect(host=None,user=None,password=’’,database=None,port=0,charset=’’)
2.read函数
pd.read_sql(sql,con,index_col=None,coerce_float=True,parse_dates=None,columns=None)
SQL SERVER连接
import pymssql import pandas as pd # 连接SQL Server数据库 connect=pymssql.connect(server='localhost',# 指定服务器名称 user='', # 指定访问数据库的用户名 password='', # 指定访问数据库的密码 database='train', # 指定数据所在数据库的名称 charset='utf8' # 指定UTF-8字符集,避免中文乱码 ) # 读取数据 data=pd.read_sql("select * from sec_buildings where direction='朝南'",con=connect) # 关闭连接 connect.close() # 数据输出 data.head()
MySQL连接
import pymysql import pandas as pd # 连接MySQL数据库 connect=pymysql.connect(host='localhost',# 指定服务器名称 user='root', # 指定访问数据库的用户名 password='123456', # 指定访问数据库的密码 database='wx', # 指定数据所在数据库的名称 port=3306, # 指定数据库连接的端口号 charset='utf8' # 指定UTF-8字符集,避免中文乱码 ) # 读取数据 data=pd.read_sql("select * from wx_gift",connect) # 关闭连接 connect.close() # 数据输出 print(data) ''' gift_id name point_needed num_released img 0 1 党员学习笔记 100 3 /static/photo/礼品1.jpg 1 2 古典书签 50 23 /static/photo/礼品2.jpg 2 3 古风扇书签 300 4 /static/photo/礼品5.jpg 3 4 党建纪念品 1000 10 /static/photo/礼品4.jpg '''
import pandas as pd # 读取数据 data3=pd.read_excel(io=r'D:\Projects\Python\Doing\pythonProject\data\data3.xlsx') # 查看数据规模 print(data3.shape # (3000, 6) # 查看表中各变量的数据类型 print(data3.dtypes) ''' id int64 gender object age float64 edu object custom_amt object order_date object dtype: object '''
从外部环境将数据读入到Python中后,首先要了解数据,数据规模、各变量的数据类型、是否存在重复值、缺失值等。
1.数据类型的判断和转换,读取数据,了解数据规模、各变量的数据类型
import pymysql import pandas as pd # 读取数据 data3=pd.read_excel(io=r'D:\Projects\Python\Doing\pythonProject\data\data3.xlsx') # 查看数据规模 # print(data3.shape # (3000, 6)3000行6列 # 查看表中各变量的数据类型 # print(data3.dtypes) ''' id int64 gender object age float64 edu object custom_amt object order_date object dtype: object ''' # 数值型转字符型 data3['id']=data3['id'].astype(str) # 字符型转数值型 data3['custom_amt']=data3['custom_amt'].str[1:].astype(float) # 字符型转日期型 data3['order_date']=pd.to_datetime(data3['order_date'],format='%Y年%m月%d日') # 重新查看数据集的各变量类型 # print(data3.dtypes) ''' id object gender object age float64 edu object custom_amt float64 order_date datetime64[ns] dtype: object ''' # 预览数据的前五行 print(data3.head()) ''' id gender age edu custom_amt order_date 0 890 female 43.0 NaN 2177.94 2018-12-25 1 2391 male 52.0 NaN 2442.18 2017-05-24 2 2785 male 39.0 NaN 849.79 2018-05-15 3 1361 female 26.0 NaN 2482.22 2018-05-16 4 888 female 61.0 本科 2027.90 2018-01-21 '''
2.冗余数据的判断和处理,监控数据表中是否存在“脏”数据,如冗余的重复观测值和缺失值等
可以通过duplicated方法进行“脏”数据的识别和处理,没有重复值返回False。若发现了重复值,可使用drop_duplicates方法将冗余信息删除。
在duplicated方法对数据行作重复性判断时,会返回一个与原数据行数相同的序列,如果数据行没有重复则对应False,否则对应True,为了得到最终的判断结果,需要再用any方法,即序列中只要存在一个true则返回true。
# 判断是否存在重复观测值 print(data3.duplicated().any()) # False
3.缺失数据的判断预处理,通常从两个方面入手:
①变量的角度,即判断每个变量中是否包含缺失值;
②数据行的角度,即判断每行数据中是否包含缺失值。
关于缺失值NaN的判断可以使用isnull方法,它会返回与原数据行列数相同的矩阵,并且矩阵的元素为bool类型的值。
为了得到每一列的判断结果,仍然需要使用any方法且设置axis参数为0;
统计各变量的缺失值个数可以在isnull的基础上使用sum方法,同样需要设置axis参数为0;
计算缺失比例就是在缺失数量的基础上除以总的样本量(shape方法返回数据集的行数和列数,[0]表示取出对应的数据行数)。
说明:axis=0行数增多,axis=1列数增多
对于缺失值的处理,最常用的方法无外乎删除法、替换法和插补法。
# 判断各变量中是否存在缺失值 print(data3.isnull().any(axis=0)) ''' id False gender True age True edu True custom_amt False order_date False dtype: bool ''' # 各变量中缺失值的数量 print(data3.isnull().sum(axis=0)) ''' id 0 gender 136 age 100 edu 1927 custom_amt 0 order_date 0 dtype: int64 ''' # 各变量中缺失值的比例 print(data3.isnull().sum(axis=0)/data3.shape[0]) ''' id 0.000000 gender 0.045333 age 0.033333 edu 0.642333 custom_amt 0.000000 order_date 0.000000 dtype: float64 ''' # 判断各数据行中是否存在缺失值 print(data3.isnull().any(axis=1)) ''' 0 True 1 True 2 True 3 True 4 False ... 2995 True 2996 False 2997 True 2998 False 2999 True Length: 3000, dtype: bool ''' # 缺失观测值的行数 print(data3.isnull().any(axis=1).sum()) # 2024 # 缺失观测值的比例 print(data3.isnull().any(axis=1).sum()/data3.shape[0]) # 0.6746666666666666 # 删除变量,如删除缺失率非常高的edu变量 data3.drop(labels='edu',axis=1,inplace=True) print(data3.head()) ''' id gender age custom_amt order_date 0 890 female 43.0 2177.94 2018-12-25 1 2391 male 52.0 2442.18 2017-05-24 2 2785 male 39.0 849.79 2018-05-15 3 1361 female 26.0 2482.22 2018-05-16 4 888 female 61.0 2027.90 2018-01-21 ''' # 删除观测值,如删除age变量中所对应的缺失观测值 data3_new=data3.drop(labels=data3.index[data3['age'].isnull()],axis=0) print(data3_new.shape) # (2900, 5) # 替换法处理缺失观测值 data3.fillna(value={'gender':data3['gender'].mode()[0],# 使用性别的众数替换缺失性别 'age':data3['age'].mean() # 使用年龄的平均值替换缺失年龄 }, inplace=True # 原地修改数据 ) print(data3.isnull().sum(axis=0)) ''' id 0 gender 0 age 0 custom_amt 0 order_date 0 dtype: int64 '''
在pandas模块中,可以使用iloc、loc或ix方法既可以筛选也可以对变量进行挑选,他们的语法相同,可以表示成[rows_select,cols_select]。