Python数据分析笔记(上)
作者:互联网
文本文件的读取
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.数据类型的判断和转换,读取数据,了解数据规模、各变量的数据类型
- astype用于数据类型的强制转换,常用转换类型包括str、float、int。
- 由于消费金额custom_amt变量中带有‘¥’,所以数据类型转换之前必须将包其删除(通过字符串切片方法删除,[1:]表示从字符的第二个元素开始截断)。
- 对于字符转日期问题,推荐使用更加灵活的pandas的to_datetime方法,在format参数的调解下,可以识别任意格式的字符型日期值。
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列数增多
对于缺失值的处理,最常用的方法无外乎删除法、替换法和插补法。
- 删除法指将缺失值所在的观测行删除,前提缺失行比例非常低如在5%以内;或者删除缺失值所对应的变量,前提是改变量中包含的缺失值比例非常高如70%左右。
- 替换法是指直接利用缺失变量的均值、中位数或众数替换该变量中的缺失值,其好处是处理速度快,弊端是容易产生有偏估计,导致缺失值替换的准确性下降。
- 插补法是指利用有监督的机器学习方法(如回归模型、树模型、网络模型等)对缺失值做预测,其优势在于预测的准确性高,缺点是需要大量的计算,导致缺失值的处理速度大打折扣。
# 判断各变量中是否存在缺失值
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]。