python数据处理 2

chapter2 数据处理

1. Anaconda:

1.1 安装

2.Numpy

Numpy的数据结构是n维数组对象,叫做ndarray.

import numpy as np
data1=[1,2,3,4]
array1 = np.array(data1)# 将数据转化为n维的numpy的数据结构
data2 = [[1,3,4],[2.5,6]]
array2 = np.array(data2)
print(array2)
print(array2.astype("str")) #将数据元素的类型转换,使用astype
print(array1*aray1) # 数组间的计算不必去循环操作,这种乘法是每个元素去执行
print(array1[0][1]) # 可以了类比php多维数组访问的方式 

3. Pandas

Pandas(panel data 面板数据)是python的一个数据分析包

3.1 panda的数据结构:

1. Series: 一维数组

2. DataFrame: 二维数组

3. Pannel: 三维数组

4.数据准备

4.1 常用数据类型

4.1.1. Logical 逻辑型

逻辑型也就是布尔类型,True False

4.1.2 Numeric数值型:

4.1.3 character 字符型:

4.2 数据结构

Pandas中主要使用的是Series,DataFrame两种数据结构

4.2.1 Series

Series 用于存储一行或者一列的数据,以及与之相关的索引的集合

Series(['数据1','数据2'],index=[索引1,索引2])
from pandas import Series
x = Series(['a',2,"螃蟹"],index=[1,2,3])
print(x[3])

Series可以存放多种数据类型.索引默认从0开始

from Pandas import Series
x = Series([1,2,3])
print(x) #打印出来第一列是索引,第二列是数值

常见操作已经错误如下:

from pandas import Series
x = Series(['a',True,1],index=['first','second','third'])
n= Series(['2'])
a = x.append(n) #通过这种形式对一个series进行追加
print(2 in a.values) #判断数值2是否在值里面
print("2" in a.values)# 判断字符串2是否在值里面
print(a[1:2]) #series 进行切片,左开右闭
b = a.drop(0) #根据索引号删除数据
print(b)
c= a.drop("first") #根据索引名删除
print(c)
#a.drop(a.index["secod"]) #这种情况是,使用index里面的是index的序号

series = Series([1,3,4,5],index=['d','a','c','f'])
print(series)
obj = series.reindex(['a','b','c','f']); # 指定顺序进行排序
print(obj)

4.2.2 DataFrame

DataFrame 用于存储多行多列的数据集合,是Series的父集.类似于excel,水平和竖直两个维度

简单示例:

from pandas import Series
from pandas import DataFrame
df = DataFrame({'age':Series([26,27,28]),"name": Series(["张三","李四","王五"])},index=[0,1,2]) #注意,第一个是Series的字典,所以他们是用{}括起来的  index是可以省略的
print(df[1:2]) #切片 打印第2条记录
print(df.iloc[0:2,0:2]) # 获取数据块元素, 第一个是行,第二个是列,第[0,2)行,第[0,2)列,注意这里不是小括号,是中括号
d = df.at[0,'name'] #获取第0 行和 'name'列的交叉点,这个是点,上面那个是块
print(d)

DataFrame的增删改查操作

from pandas import Series
from pandas import DataFrame
df1 = DataFrame({'age':[21,22,23],'name':['张三','李四','王五']})
df2 = DataFrame(data={'age':[21,22,23],'name':['张三','李四','王五']},index=["first","second","third"])
#访问行
print(df1[1:100]) #方位索引[1-100) 的元素
print(df2["third":"second"]) # 索引大于third的索引(2),并且小于second(1)的索引. 空数据
print(df2["third":"third"])
print(df2["third":"second"]) #为空,

#访问列
print(df1["age"]) #直接填入列明,查询列数据
print(df1[df1.columns[0:1]]) #通过列号索引获取列名称df.columns[0:1]
print(df1.iloc[0:1,0:1]) #访问列快
print(df1.at[1,'name']) #访问某一个点, 第1行,name列的交叉点

#修改列名称
df1.columns=['age2','name2'] #更上面获取列明的进行对比,注意这里是等号
print(df1)

#修改行索引
df1.index = range(1,4)

#根据行索引进行删除
df1.drop(1,axis=0) #axis=0 标识行,可以省略不写

e = df1.drop(1) #drop 语句并不会删除原来的变量,会将删除后的数据返回.
print(df1)
print(e)

f = df1.drop('age2',axis=1) # axis=0 标识行 axis=1标识列
print(df1)
print(f)

#对原数据进行删除操作的
del df1['age2']
print(df2)

#增加列
df1["newColumns"] = [2,3,5] #直接对源数据进行修改
print(df1)
#增加行
#增加行可以通过两个DataFrame合并来解决:
df3 = DataFrame([[1,2],[7,8]],columns=list("AB"))
print(df3)
df4 = DataFrame([[56,23],[2323,33]],columns=list("AB"))
print(df4)
g = df3.append(df4) #仅做简单的追加,index各自保持原来的,同时append不会对源数据进行改变,会返回新的df对象
print(g)
h = df3.append(df4,ignore_index=true)# 这种是重新指定的索引的方法

4.3 数据导入

在pandas中数据导入,常用的函数是read_csv,read_excel,read_table,read_sql.

4.3.1 txt导入

read_table 用于读取txt文件.命令格式如下:

read_table(file,name=[列名称1,列名称2,..],sep="")
  • file 文件路径,文件名
  • name 为名称
  • sep为分隔符,默认为空
from pandas import read_table
df = read_table(r'E:\data_temp\read_table.txt');
print(df.head())

r标识不转义后面的斜线

4.3.2 csv文件导入

read_csv 函数可以导入csv文件:

用法:

read_csv(file,name=[列名称1,列名称2,..],sep="")

示例:

from pandas import read_table
from pandas import read_csv
df1 = read_csv(r'E:\data_temp\read_csv.csv')
print(df1)

需要注意的是,csv文件的编码个是 要与python文本的格式保持一致

4.3.3 excel文件导入

read_excel 函数导入excel文件:

用法:

read_excel(file,name=[列名称1,列名称2,..],sheet_name,header=0)

header =0 标识第一行作为表头显示,header=1 表示把第一行数据丢弃.

示例:

from pandas import read_excel
df1 = read_excel(r'E:\data_temp\read_excel.xlsx')
print(df1)

4.3.4 mysql文件导入

python中操作mysql的模块是PyMySQL

import pandas as pd
import pymysql

dbconn = pymysql.connect(host="127.0.0.1",
                         database="demo",
                         user="root",
                         password="root",
                         port=3306,
                         charset="utf8")
sqlcmd = "select * from  mobile"
a= pd.read_sql(sqlcmd,dbconn) #将mysql数据导入pandas模块
print(a)
dbconn.close()

读取myql的其他方法:

import pymysql.cursors
import pymysql
import pandas as pd

config={'host':'localhost',
        'port':3306,
        'user':'root',
        'password':'root',
        'db':'demo',
        'charset':'utf8',
        'cursorclass': pymysql.cursors.DictCursor}
## 创建连接
conn = pymysql.connect(**config)
try:
    with conn.cursor() as cursor:
        sql = "select * from mobile"
        cursor.execute(sql)
        result = cursor.fetchall()
finally:
    conn.close()
    
df = pd.DataFrame(result)
print(df.head())

另一种mysql读取文件:

import pandas as pd
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://root:root@localhost:3306/demo')
df = pd.read_sql('select * from mobile',engine)
print(df)

4.4 数据导出

4.4.1 导出csv文件

to_csv 函数可以加你数据导出为csv文件,命令格式如下:

to_csv(file_path, sep='','',index=TRUE,header=TRUE)
  • file_path : 文件路径
  • sep: 分隔符
  • index 导出是否显示行号 ,默认true
  • header :是否导出列名,默认true
from pandas import DataFrame
from pandas import Series
df = DataFrame({'age':Series([21,22,23]),'name': Series(['张三','李四','王五'])})
df.to_csv(r'E:\data_temp\to_csv.csv',encoding="utf_8_sig") #中文乱码,utf-8格式无法解决

4.4.2 导出excel文件

to_excel 导出excel格式文件,用法同上

from pandas import DataFrame
from pandas import Series
df = DataFrame({'age':Series([21,22,23]),'name': Series(['张三','李四','王五'])})
df.to_excel(r'E:\data_temp\to_excel.xlsx',encoding="utf_8_sig") #中文乱码,utf-8格式无法解决

4.4.3 导出到Mysql库

to_sql将数据存储到mysql

from pandas import DataFrame
from pandas import Series
from sqlalchemy import create_engine

#启动引擎
engine = create_engine("mysql+pymysql://root:root@localhost:3306/demo?charset=utf8")
df = DataFrame({'mobile':Series(["张三","李四"]),"mobile_encrypt":Series(["ojbk1","ojbk2"])})
df.to_sql(name="mobile",
          con=engine,
          if_exists='append',
          index=False,
          index_label=False)

tip: 注意文件名不要和模块名重复,会报错

5.数据处理

5.1 数据清洗

在数据分析前,海量原始数据中存储着大量不完整, 不一致,异常的垃圾数据.严重影响分析数据的结果,所以数据清洗尤为重要.

1. 重复值处理:

利用pandas的模块处理重复数据的问题,步骤如下:

  • 利用DataFrame中的duplicated方法,返回一个布尔值的Series,显示是否有重复行,没有重复行为False,有重复行的第二个起均为True

  • 再利用DataFrame的drop_duplicates方法,返回一个移除重复行的DataFrame

    示例:

    from pandas import Series
    from pandas import DataFrame
    df = DataFrame({'age':Series([21,12,23]),"name":Series(["张三","张三","王五"])})
    print(df)
    print(df.duplicated("name"))
    new_df = df.drop_duplicates() #两个字段均重复的,才进行删除操作
    new_df1 = df.drop_duplicates("name") #name字段如果有重复的,则把除第一个外,所有行记录都删除
    print(new_df)
    print(new_df1)
    

2. 缺失值处理:

从统计上说,缺失的数会导致样本数据不能很好的代表整体

处理缺失数据的两个步骤:

  • 识别缺失数据

    pandas使用NaN标识数字缺失数据,并使用.isnull,和.notnull函数判断缺失情况

    缺失数据的识别:

    from pandas import DataFrame
    from pandas import read_excel
    df = read_excel(r'E:\data_temp\data.xlsx')
    print(df)
    print(df.isnull())
    
  • 对缺失数据进行处理

    • 使用dropna: 去除数据结构中值为空的行.

      from pandas import DataFrame
      from pandas import read_excel
      df = read_excel(r'E:\data_temp\data.xlsx')
      print(df)
      print(df.isnull())
      
      new_df = df.dropna();# 去除具有空数据的行
      print(new_df)
      
      
    • 使用df.fillna(): 用其他值替代

      from pandas import DataFrame
      from pandas import read_excel
      df = read_excel(r'E:\data_temp\data.xlsx')
      print(df)
      
      print(df.isnull())
      
      new_df = df.dropna();
      print(new_df)
      
      new_df2 = df.fillna("?") #将NaN 替换为一个?,可以是任意字符串
      print(new_df2)
      new_df3 = df.fillna(method="pad") #将NaN 替换为一个?,可以是任意字符串
      print(new_df3)
      
      
    • 使用 df.filena(method='pad') :用前一个值来替代, 使用.fillna(method='')

      from pandas import DataFrame
      from pandas import read_excel
      df = read_excel(r'E:\data_temp\data.xlsx')
      
      new_df3 = df.fillna(method='pad') # 使用同一字段下,前一个(索引小于他的)值替换
      print(new_df3)
      
      new_df4 = df.fillna(method='bfill')# 使用同一字段下,后一个(索引小于他的)值替换
      print(new_df4)
      
    • 使用.mean() :使用平均数或者其他统计常量来代替

      from pandas import DataFrame
      from pandas import read_excel
      df = read_excel(r'E:\data_temp\data.xlsx')
      new_df5 = df.fillna(df.mean())
      print(new_df5)`
      
      new_df7= df.fillna(df.mean()["英语":"数学"]) #列从英语到数学区间内的字段,使用平均数处理
      print(new_df7)
      
    • 对不同的列填充不同的值:

      df.fillna({'列名1':值,'列名2':值2})
      
      new_df8 =df.fillna({"数学":9999,"语文":6666})
      print(new_df8)
      
    • 去除字符数据首尾指定字符,类比php中的trim

      from pandas import DataFrame
      df_new = DataFrame({"age":Series([11,22,33]),"name":Series(["张三  ","李四  "," 王五"])})
      print(df_new)
      print(df_new["name"].str.rstrip()) 
      

5.2 数据抽取

5.2.1 字段抽取

字段抽取指的是抽取指定位置的数据做成新的列,命令如下

slice(start,stop)

使用实例

from pandas import DataFrame
from pandas import Series
from pandas import read_excel

df = read_excel(r'C:\workspace\git_repo\python\data_analysis\chapter2\resource\data.xlsx')
print(df)
mobile = df["电话"].astype(str) # astype将列的值转换数据类型
print(mobile)

band = mobile.str.slice(0,3) #抽取前三位,用于判断电话服务商
print(band)
area = mobile.str.slice(3.7) #用于判断区域
 
tell = mobile.str.slice(7,11)
print(tell)

5.2.2 字段拆分

拆分是按照指定的分隔符sep,拆分已有的字符串

split(sep,n,expand=False)
  • sep用于分隔字符串的字符
  • n 表示分隔后新增的列数
  • expand 表示是否展开为数据框

实例:

from pandas import DataFrame
from pandas import Series
from pandas import read_excel

df = read_excel(r'C:\workspace\git_repo\python\data_analysis\chapter2\resource\data.xlsx')
ip = df["ip"].astype(str)
ip = ip.str.strip()
print(ip)

new_df = ip.str.split('.',1,True)
print(new_df)
'''
192.168.0.86这个ip,根据 . 进行查分,如果列数n=1,expand=False则会拆分成 [192,168.0.86],
如果expand=True, 会拆分成 192, 168.0.86
'''
#如果是要给列重新命名,必须是dataFrame对象,上面的new_df已经转换成list了

5.2.3 重置索引

重置索引是指指定的列作为索引,方便对其他数据进行操作.使用如下:

df.set_index("列名")

使用实例

from pandas import DataFrame
from pandas import Series

df1 = DataFrame({"age":Series([21,22,23,24]),"name":Series(["张三","李四","王五","赵六"])})
print(df1)

df2 = df1.set_index("name") #以name作为新的索引/行号
print(df2)

5.2.4 记录抽取

记录抽取是根据一定条件对数据进行抽取:

df[condition] #condition是具体的条件

参数说明: condition 表示过滤条件

返回值: DataFrame

常见的过滤条件有:

  • 比较运算符: ==,<,>,<=,>=,!= 如: df[df.comments>1000]
  • 范围运算: between(left,right) 如: df[df.comments.between(1000,10000)]
  • 空置运算符: panda.isnull(column)如df[df.title.isnull]
  • 字符匹配: str.contains(pattern,na=False)
  • 逻辑运算: &,|,not

使用实例:

import pandas
from pandas import read_excel

df =read_excel(r'C:\workspace\git_repo\python\data_analysis\chapter2\resource\data.xlsx')
print(df[df.电话==15931822328])
print(df[df.电话>15931822330])

5.2.5随机抽样

所及抽样指随机从数据中按照一定的行数或者比例进行抽取的取样,随机抽样格式如下

numpy.random.randint(start,end,num)
  • start: 开始值
  • end: 结束值
  • num: 表示抽样个体

返回值: 索引值序列

使用实例:

import numpy as np
import pandas 
df = DataFrame(r'C://xxxx')
r = np.random.randint(1,10,3) #从1到10取3个,随机抽样
print(df.loc[r]) # 通过向.loc中传入索引号可获取指定行数的记录

5.2.6通过索引抽取数值

使用索引名(标签)选取数据,df.loc[行标签,列标签]

实例代码如下:

df.set_index("学号")
print(df.head())
print(df.loc[1:1]) #这个都是闭区间,两端都可以去的到

5.2.7 字典数据抽取

字典数据抽取是指将字典数据抽取为dataframe,有以下三种方法:

  • 字典的key和value都作为一列

5.3 插入记录

5.4 修改记录

5.5 交换行或列

5.6 排名索引

5.6.1 sort_index 重新排序

5.6.2 reindex 重新索引

5.6.3 set_index 重置索引

5.6.4 索引还原

5.7 数据合并

5.7.1 记录合并

5.7.2 字段合并

5.7.3 字段匹配

5.8 数据计算

5.8.1 简单计算

5.8.1 数据标准化

5.9 数据分组

5.10 日期处理

5.10.1 日期转换

5.10.2 日期格式化

5.10.3 日期抽取

posted @ 2020-05-22 00:05  callmelx  阅读(186)  评论(0编辑  收藏  举报