基于Python的大数据分析基础(四)---Pandas数据处理

 5.Pandas数据处理
    5.1 数据清洗
    5.2 数据抽取
    5.3 插入记录
    5.4 修改记录
    5.5 交换行和列
    5.6 排名索引
    5.7 数据合并

5.1到5.7是在原来的pandas的基础上稍微深化了下,顺带复习。5.8之后将详细编写
    5.8 数据计算
    5.9 数据分组
    5.10 数据处理

# -*- coding: UTF-8 -*-
'''
@Author :Jason
pandas 数据处理,在之前的数据结构基础上升级
'''
from pandas import DataFrame,Series
import pandas as pd
class DataProcessing(object):
    def __init__(self):
        self.data =  {
            "age":Series([18,85,64,85,85]),
            "name":Series(["Jason","John","Jerry","John","John"])
        }
    def dataClean(self):
        # 5.1 数据清洗:去重 + 缺失值处理

        df = DataFrame(data=self.data)
        print(df)
        '''
           age   name
        0   26  Jason
        1   85   John
        2   64  Jerry
        3   85   John
        4   85   John
        '''
        print(df.duplicated()) #False代表不重复,True 重复
        '''
        0    False
        1    False
        2    False
        3     True
        4     True
        dtype: bool
        '''
        print(df.duplicated("name")) #name重复情况
        '''
        0    False
        1    False
        2    False
        3     True
        4     True
        dtype: bool
        '''
        print(df.drop_duplicates("age")) #去除重复数据
        '''
           age   name
        0   18  Jason
        1   85   John
        2   64  Jerry
        '''
        #缺失值之前处理过,这里初略
        '''
        df.isnull() 缺失True,不缺失为False
        df.notnull() 和上面相反
        df.dropna()  去除缺失行,如果删除列的话,加参数axis=1,参数how="all",全却删除,any有缺就删除
        df.fillna()  填充。df.fillna(value="",method="") value指定值替换缺失值,
                                method参数 pad,前一个替换,bfill,后一个替换,mean()平均值替换
                                df.fillna(df.mean()["填补列名":"计算均值的列名"]),
                                df.fillna({"列名1":值1,"列名2":"值2"}) 不同列不同填充
        df["列或列"].str.strip() 去除空格,和字符用法一致               
        '''

    # 5.2 数据抽取
    def extractionData(self):
        df = pd.read_excel("./FIle/lemon.xlsx",sheet_name="student")
        name = df["name"].str.slice(0,1)  #抽取名字中的姓,用法字符串切片....
        # print(name) #0  黄 1  华 2  毛 Name: name, dtype: object

        #5.2.1 重置索引 将name变为索引
        df1 = DataFrame(self.data).set_index("name")
        print(df1)
        '''
               age
        name      
        Jason   18
        John    85
        Jerry   64
        John    85
        John    85
        '''
        #5.2.3 抽取name = "John"
        print(df1.ix["John"])
        '''
              age
        name     
        John   85
        John   85
        John   85
        '''
    # 5.3 插入记录
    def insertData(self):
        df = pd.DataFrame({
            "a":[1,2,3],
            "b":["a","b","c"],
            "c":["A","B","C"]
        })
        line = pd.DataFrame({df.columns[0]:"--",df.columns[1]:"--",df.columns[2]:"--"},index=[1,2,3])
        print(line)
        #抽取df的index = 1,2,3的行赋值为  "--"
    # 5.4 修改记录:单值替换 和 整行整列替换
    def changeData(self):
        df = DataFrame(self.data)
        df2 = df.replace("Jason","ABC") #单值替换 为ABC
        print(df2)
        df3 = df.replace(["Jason","John"],["A","b"]) #A替换Jason,b替换John
        df["age"] = [1,2,3,4,5]
        print(df) #整列替换  为[1,2,3,4,5]
    # 5.5 交换  行和列
    def changeRowCol(self):
        df = DataFrame(self.data)
        print(df)
        print(df.reindex([1,0,2,3,4])) # 1,2行互换,其他不换
        # print(df.reindex(columns = ["name","age"])) #name 和 age列互换
    # 5.6 排名索引
    def sortIndex(self):
        df0 =  {"China":[9,7,10],"Japan":[6,8,7],"America":[9,5,8]}
        df = DataFrame(df0,index=["a","c","d"])
        # print(df.sort_index(ascending=False)) #默认index升序,False降序
        # print(df.sort_index(by=["China","Japan"])) #by指定列,可以一列也可以多列,但是只有第一列生效

    # 5.7 数据合并 append,concat 数组合并
    #merge(df1,df2,left_on=index,right_on=index),类似于Excel中的VLOOKUP和sql的多表连接
    def mergeData(self):
        df1 = DataFrame(self.data)
        df2 = DataFrame({
            "name":[4,5,6,7],
            "age":[1,2,3,4]
        })
        df = pd.concat([df1,df2],ignore_index=True)
        # print(df) #合并起来,index自动顺延
        # print(df1.append(df2,ignore_index=True))

        df3 = df2["name"] + df2["age"]
        # print(df3) #变成索引 + 5,7,9,11

        df4 = DataFrame({
            "name":["Jason","John"],
            "age":[18,19]
        })
        df5 = DataFrame({
            "name":["Jason","John"],
            "Phone":[1234567,9897769]
        })
        df6 = pd.merge(df4,df5,left_on="name",right_on="name") #理解为左右连接
        print(df6)


if __name__ == "__main__":
    DP = DataProcessing()
    DP.dataCalution()

    5.8 数据计算
               5.8.1简单计算

简单计算是指通过对各宇段进行加、减、乘、除等四则算术运算,结果作为新的宇段。

 

    # 简单计算
    def dataCalution(self):
        df1 = DataFrame({
            "name": ["Jason", "John"],
            "age": [18, 19],
            "phone": [1234567, 9897769]
        })
        df1["age+phone"] = df1["age"].astype(int)+ df1["phone"].astype(int)
        print(df1["age+phone"])

          5.8.2数据标准化

            数据标准化 (归一化〉处理是数据分析和挖掘的一项基础工作,不同评价 指标往往具有不同 的 量纲和量纲单位,这样的情况会影 响到数据分析 的结果,为了消除指标之 间的 量纲影 响 ,需要进行数据标准化处 理 ,以 解决数据指标之 间的 可 比性。原始数据经过数据标准化处理后,各指标处于 同 一数量级,适合进行综合对 比 评价。

首先回答一个问 题:为什么要将数据标准化?

            由于不同变量常常具有不同的单位和不同的变异程度。不同的单位常使系数的实践解释发生困难。例如,第 l 个变量的单位是峙,第 2 个变量的单位是 cm,那么在计算绝对距离时将出现两个问题 。第 1 个变量观察值之差 的绝对值 (单位是 kg )与第 2 个变量观察值之差的绝对值(单位是 cm )相加的情况,5kg 的 差异怎么可 以与 3cm 的 差异 相加?不同变量自身具有相 差较大的变异时,不同变量所占的 比重也大不相同。例如第 1 个变量的数值范围在 2%~4%之间,而第 2 个变量 的数值范围在 1000~5000 之间 。 为了消除量纲影 响和变量自身变异大小和数值大小的影响,故将数据标准化。数据标准化常用的方法为 :

                 ( 1) min-max 标准化( Min-Max Normalization)

            又名离差标准化,是对原始数据的线性转化,公式如下:

                                                       X*=(x-min)/(max-min)

         其中, max 为样本最大值; min 为样本最小值。当有新数据加入时需要重新进行数据归一化。

代码实现

    def standardData(self):
        #1.min-max标准化(Min-Max Normalization)
        df = pd.read_excel("./FIle/grade.xlsx")
        # print(df.head())
        '''
           Unnamed: 0          学号        班级    姓名 性别 英语 体育 军训数分 高代 解几
            0           0  2308024241  23080242  成龙  男  76  78  77  40  23  60
            1           1  2308024244  23080242  周怡  女  66  91  75  47  47  44
            2           2  2308024251  23080242  张波  男  85  81  75  45  45  60
            3           3  2308024249  23080242  朱浩  男  65  50  80  72  62  71
            4           4  2308024219  23080242  封印  女  73  88  92  61  47  46
        '''
        scale = (df.数分.astype(int) - df.数分.astype(int).min()) \
                /(df.数分.astype(int).max()-df.数分.astype (int) .min())
        print("数据标准化\n",scale)
        '''
        0     0.000000
        1     0.184211
        ......
        19    0.842105
        Name: 数分, dtype: float64
        '''

 

              ( 2) Z-score 标准化方法

               Z-score 标准化方法适用于属性 A 的最大值和最小值未知的情况,或有超出 取值范围的离群数据的情况。这种方法给                  予原始数据的均值( Mean )和标准差 ( Standard Deviation 〉进行数据的标准化。经过处理的数据符合标准正态分                   布,即均值为 0 ,标准差为 l , 转化函数为: X*=(x-µ)/σ,

              其中, μ 为所有样本数据的均值, σ 为所有样本数据的标准差。

                      将数据按其属性(按列进行)减去其均值,并除以其标准差,得到的结果 是,对于每个属性(每列)来说所有数                  据都聚集在 0 附近,标准差为 1 。

              使用 sklearn.preprocessing. scale()函数,可以直接将给定数据进行标准化:

   #2.Z-score 标准化方法
        from sklearn import preprocessing
        import numpy as np
        df = pd.read_excel("./FIle/grade.xlsx")
        df1 = df["数分"]
        df_scaled = preprocessing.scale(df1)
        print(df_scaled)
        '''
        [-2.4465804  -1.69708093 -1.91122364  0.97970287 -0.198082    0.87263152
         -0.198082    0.65848882  0.23020341 -0.30515335 -0.30515335  0.12313205
         -0.198082    0.55141746 -0.198082    0.0160607   1.62213099  0.65848882
          0.76556017  0.97970287]
        '''

            也可以使用 sklearn.preprocessing. S tandardSca !er 类,使用该类的好处在于 可以保存训练集中的参数 (均值、标准                差〉,直接使用其对象转换测试集数据:

   X = np.array([[1,-1,2],[2,0,0],[0,1,-1]])
        # print(X)
        '''
        [[ 1 -1  2]
         [ 2  0  0]
         [ 0  1 -1]]
        '''
        scaler = preprocessing.StandardScaler().fit(X) #StandardScaler(copy=True, with_mean=True, with_std=True)
        # print(scaler.mean_) #[1.         0.         0.33333333]
        # print(scaler.scale_) #[0.81649658 0.81649658 1.24721913]
        # print(scaler.transform(X))
        '''
        [[ 0.         -1.22474487  1.33630621]
         [ 1.22474487  0.         -0.26726124]
         [-1.22474487  1.22474487 -1.06904497]]
        '''
        print(scaler.transform([[-1.,1.,0.]])) #[[-2.44948974  1.22474487 -0.26726124]]

    5.9 数据分组

    直白理解:新增一列,存储数据的特征(借助机器学习的特征工程和特征值最好理解),格式                                                                                       cut(series,bins,right=True,labels=NULL) 

    # 5.9 数据分组
    def dataGroup(self):
        df = pd.read_excel('./File/grade.xlsx')
        # print(df.shape) #(20,11)
        bins = [min(df.解几)-1,69,70,80,max(df.解几)+1]
        lab = ["不及格","及格","良好","优秀"]
        newDf = pd.cut(df.解几,bins,right=False,labels=lab)
        # print(newDf.head())
        '''
        0    不及格
        1    不及格
        2    不及格
        3     良好
        4    不及格
        Name: 解几, dtype: category
        Categories (4, object): [不及格 < 及格 < 良好 < 优秀]
        '''

        df["grade"] = newDf
        print(df.head())
        '''
        Unnamed: 0          学号        班级  姓名 性别  英语  体育  军训  数分  高代  解几 grade
        0           0  2308024241  23080242  成龙  男  76  78  77  40  23  60   不及格
        1           1  2308024244  23080242  周怡  女  66  91  75  47  47  44   不及格
        2           2  2308024251  23080242  张波  男  85  81  75  45  45  60   不及格
        3           3  2308024249  23080242  朱浩  男  65  50  80  72  62  71    良好
        4           4  2308024219  23080242  封印  女  73  88  92  61  47  46   不及格
        '''

    5.10 日期处理: 和Python基础的time模块有点类似

    def aboutTime(self):
        from pandas import to_datetime
        df = pd.read_csv("./File/time1.csv",encoding="utf-8")
        # print(df)
        '''
           num  price  year  month       date
        0  123    159  2016      1   2016/6/1
        1  124    753  2016      2   2016/6/2
        2  125    456  2016      3   2016/6/3
        3  126    852  2016      4   2016/6/4
        4  127    210  2016      5   2016/6/5
        5  115    299  2016      6   2016/6/6
        6  102    699  2016      7   2016/6/7
        7  201    599  2016      8   2016/6/8
        8  154    199  2016      9   2016/6/9
        9  142    899  2016     10  2016/6/10
        '''
        df_dt = to_datetime(df["date"],format="%Y/%m/%d") #format格式啊
        # print(df_dt)
        '''
        0   2016-06-01
        1   2016-06-02
        2   2016-06-03
        3   2016-06-04
        4   2016-06-05
        5   2016-06-06
        6   2016-06-07
        7   2016-06-08
        8   2016-06-09
        9   2016-06-10
        Name: date, dtype: datetime64[ns]
        '''
        print(df_dt.dt.year) #打印所有的年,
        '''
        0    2016
        1    2016
        2    2016
        3    2016
        4    2016
        5    2016
        6    2016
        7    2016
        8    2016
        9    2016
        Name: date, dtype: int64
        '''
        ## 类似还有df_dt.dt.day,df_dt.dt.month,df_dtweekday,df_dt.dt.hour,df_dt.dt.second

参照:《基于Python的大数据分析基础及实战》

你可能感兴趣的:(Python,数据分析)