Python教程

Python数据分析笔记(上)

本文主要是介绍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]。

  • iloc只能通过行号和列号进行数据的筛选,可以将iloc中的’i’理解为integer,即只能向[rows_select,cols_select]指定整数列表。对于这种方式的索引,第一行货第一列必须用0表示,既可以向rows_select或cols_select指定连续的整数编号(即切片用法start
这篇关于Python数据分析笔记(上)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!