机器学习(二)Pandas库

  1. 首先来介绍什么是pandas
    1. pandas是基于numpy的一种工具,是为了解决数据分析任务而创建的,它纳入了大量库和一些标准的数据模型。提供了许多高效的操作和方法
    2. 其最初作为金融分析工具而开发出来,因此对时间序列分析有很好的支持(虽然我并没有学那么多。。。)
    3. 数据结构(来自百度百科)      Series:一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很相近。Series如今能保存不同种数据类型,字符串、boolean值、数字等都能保存在Series中。        Time- Series:以时间为索引的Series。          DataFrame:二维的表格型数据结构。很多功能与R中的data.frame类似。可以将DataFrame理解为Series的容器。以下的内容主要以DataFrame为主。        Panel :三维的数组,可以理解为DataFrame的容器

  2. 直接记录自己的学习成果吧
    1. 初始化与显示
      1. import pandas
        #pandas 是一个 数据预处理的库,实现功能要强于numpy
        #<class 'pandas.core.frame.DataFrame'>这事pandas的核心结构
        food_info = pandas.read_csv("food_info.csv")
        print(type(food_info))
        #pandas将str的数据当作object结构
        print(food_info.dtypes)
        #print(help(pandas.read_csv))
        
        
        #将刚才读的数据 显示出来,但是不会都显示 只会显示前五条(默认),可以指定参数
        food_info_head = food_info.head()
        #food_info_head = food_info_head(3) #显示前三行
        print(food_info_head)
        
        #显示后五行
        food_info_tail = food_info.tail()
        print(food_info_tail)
        #显示所有列信息
        columns = food_info.columns
        print(columns)
        #显示矩阵维度
        print(food_info.shape)
    2. 基本的取值与计算操作
      1. import pandas
        
        food_info = pandas.read_csv("food_info.csv")
        #取第一行数据 用到了loc函数
        print(food_info.loc[0])
        
        #Pandas中的数据类型
        #object _For string values
        #int _ For Integer valuse
        #float _ For float values
        #datatime _ For time values
        #bool _  For Boolean valuse
        
        #可以使用切片来定位数据
        print(food_info[3:6])
        #可以取任意值通过想numpy那种索引的方式
        two_five_ten = [2,5,10]
        print(food_info.loc[two_five_ten])
        
        # #通过第一行的列名字拿到列
        ndb_clo = food_info["NDB_No"]
        print(ndb_clo)
        
        # #取某几个列,
        columns = ["Zinc_(mg)","Copper_(mg)"]
        zinc_copper = food_info[columns]
        print(zinc_copper)
        
        #找到哪些列是以 g 为单位 哪些是以 mg为单位
        col_names = food_info.columns.tolist()
        print(col_names)
        gram_columns = []
        for c in col_names:
            if c.endswith("(g)"):
                gram_columns.append(c)
        
        #找到之后做成一个列表 当成索引 然后再原数据表中找
        gram_df = food_info[gram_columns]
        print(gram_df.head(3))
        
        #将mg转换为g 为单位的 (/1000)操作 ,会将此列所有元素 / 1000
        print(food_info["Iron_(mg)"])
        div_1000 = food_info["Iron_(mg)"] / 1000
        print(div_1000)
        
        #两列的维度相同。此操作会将对应位置的数相乘
        water_energy = food_info["Water_(g)"] * food_info["Energ_Kcal"]
        water_energy = food_info["Water_(g)"] * food_info["Energ_Kcal"]
        #将iron_(mg)/1000 后赋给一个 DataFrame  然后 创建一个新的列来接受这个dataframe
        iron_grams = food_info["Iron_(mg)"] / 1000
        print(food_info.shape)
        food_info["Iron_(g)"] = iron_grams
        print(food_info.shape)
        
        
        #求某一列的最大值
        max_calories = food_info["Energ_Kcal"].max()
        normalized_calories = food_info["Energ_Kcal"] / max_calories
        print(max_calories)
        print(normalized_calories)
    3. 设置索引
      1. import pandas as pd
        
        fandango = pd.read_csv("fandango_score_comparison.csv")
        print(type(fandango))
        fandango_films = fandango.set_index("FILM",drop=False)  #将电影名当作索引,相当于又添加了一个索引,数值索引也可以用
        print(fandango_films.index)
    4.   关于Serises
      1. #series 是 dataFrame 的其中一行或其中一列
        import pandas as pd
        from pandas import Series
        import numpy as np
        
        fandango = pd.read_csv("fandango_score_comparison.csv")
        series_film = fandango['FILM']
        print(type(series_film))
        print(series_film[0:5])
        series_rt = fandango["RottenTomatoes"]
        print(series_rt[0:5])
        
        #新建一个series结构
        film_names = series_film.values
        #从dataFrame中拿出来的数据是series类型的,而从series中拿出来的数据与ndarray类似,pandas是封装在numpy基础之上的
        print(type(film_names))
        rt_score = series_rt.values
        #设置一个Series  设置键,值
        series_custom = Series(rt_score,index = film_names)
        
        print(series_custom[['Minions (2015)','Leviathan (2014)']])
        
        fiveten = series_custom[5:10]
        print(fiveten)
        
        sc2 = series_custom.sort_values()   #按值排序
        sc3 = series_custom.sort_index()    #按键排序
        print(sc2)
        print(sc3)
        
        #对series中的数据所做的数学操作
        print(np.add(series_custom,series_custom))
        print(np.sin(series_custom))
        print(np.max(series_custom))
        
        citys = Series(fandango["RottenTomatoes"].values , index=fandango["FILM"])
        users = Series(fandango["RottenTomatoes_Users"].values,index=fandango["FILM"])
        mean = (citys + users) / 2
    5. 排序
      1. import pandas
        
        food_info = pandas.read_csv("food_info.csv")
        #默认从小到大排序
        food_info.sort_values("Sodium_(mg)",inplace=True)
        print(food_info["Sodium_(mg)"])
        #从大到小排序,升序指定为false
        #缺失值放到最后
        food_info.sort_values("Sodium_(mg)",inplace=True,ascending=False)
        print(food_info["Sodium_(mg)"])
    6. 自定义函数
      1. import pandas as pd
        
        titanic_survival = pd.read_csv("titanic_train.csv")
        
        #遇到pandas函数无法处理时,自定义函数
        #返回第100条数据
        def hundredth_row(column):
            hundredth_item = column.loc[99]
            return hundredth_item
        
        #调用apply方法找到第100条数据
        hundredth_row = titanic_survival.apply(hundredth_row)
        print(hundredth_row)
        
        #计算每一个列(每一条属性)其缺失值是多少
        def not_null_count(column):
            #对传入的整个数据集的每一条column逐条计算null的坐标
            column_null = pd.isnull(column)
            #print(column_null)
        
            #根据坐标找到那些为null的值,生成一个列表,然后返回列表的长度
            null = column[column_null]
            return len(null)
        
        column_null_count = titanic_survival.apply(not_null_count)
        print(column_null_count)
        
        def which_class(row):
            #对传入的每一行做操作
            pclass = row['Pclass']
            if pd.isnull(pclass):
                return "Unknown"
            elif pclass == 1:
                return "FirstClass"
            elif pclass == 2:
                return "SecondClass"
            elif pclass == 3:
                return "ThirdClass"
        #轴用来为超过一维的数组定义的属性,二维数据拥有两个轴:第0轴沿着行的垂直往下,第1轴沿着列的方向水平延伸。
        classes = titanic_survival.apply(which_class,axis=1)
        print(classes)
        
        #将连续值离散化,大于18随返回False 小于18返回True,未知返回unknown
        def is_minor(row):
            age = row["Age"]
            if age < 18:
                return "minor"
            elif pd.isnull(age):
                return  "Unknown"
            else:
                return "adult"
        
        age_labels = titanic_survival.apply(is_minor,axis=1)
        print(age_labels)
        
        #计算获救人数与年龄的关系,计算成年人获救的平均值和非成年人获救的平均值
        titanic_survival["age_labels"] = age_labels
        age_group_survival = titanic_survival.pivot_table(index = "age_labels" , values="Survived")
        print(age_group_survival)
    7. 实践
      1. import numpy as np
        import pandas as pd
        titanic_survival = pd.read_csv("titanic_train.csv")
        
        #print(titanic_survival.head())
        
        age = titanic_survival["Age"]
        #print(age[0:10])
        age_is_null = pd.isnull(age)
        #print(age_is_null)
        #将他作为索引,找出age中为空的值
        age_null_ture = age[age_is_null]
        #print(age_null_ture)
        age_null_count = len(age_null_ture)
        print(age_null_count)
        
        #因为其中有空值,所以求平均也会有空值,所以应该将缺失值去掉
        #avg_age = sum(titanic_survival["Age"]) / len(titanic_survival["Age"])
        #print(avg_age)
        
        #过滤出年龄为空的所有的值(过滤出age_is_null中所有为true的值,留下那些false值)
        # good_ages = titanic_survival["Age"][age_is_null == False]
        # print(good_ages)
        # correct_avg_age = sum(good_ages) / len(good_ages)
        #可以直接调用pandas中自带的函数来求均值
        correct_avg_age = titanic_survival["Age"].mean()
        print(correct_avg_age)
        
        #三个不同的仓位等级 其票价的平均值为多少
        passenger_classes = [1,2,3]
        fares_by_class = {}
        for this_class in passenger_classes:
            #找到三种不同的等级
            pclass_rows = titanic_survival[titanic_survival["Pclass"] == this_class]
            pclass_fare = pclass_rows["Fare"]
            fare_for_class = pclass_fare.mean()
            fares_by_class[this_class] = fare_for_class
        
        print(fares_by_class)
        fare_class = titanic_survival.pivot_table(index = "Pclass" , values = "Fare" , aggfunc=np.mean)
        print(fare_class)
        
        survival_by_class = {}
        for this_class in passenger_classes:
            survival_rows = titanic_survival[titanic_survival["Pclass"] == this_class]
            survival_people = survival_rows["Survived"]
            survived_for_class = survival_people.mean()
            survival_by_class[this_class] = survived_for_class
        
        print(survival_by_class)
        
        #求各个仓位 获救人数的平均值,就不用循环了直接用pivot_table函数
        #求 以Pclass为基准的。与Survived有关的平均值
        passenger_survival = titanic_survival.pivot_table(index = "Pclass", values="Survived",aggfunc=np.mean)
        print(passenger_survival)
        
        #如果不指定aggfunc,则默认求均值 操作
        passenger_age = titanic_survival.pivot_table(index = "Pclass" , values = "Age" )
        print(passenger_age)
        
        #求一个值与其他两个值的关联,求登船口与费用 和 生还量 的总值 之间的关系
        port_stats = titanic_survival.pivot_table(index = "Embarked" , values=["Fare","Survived"] ,aggfunc=np.sum)
        print(port_stats)
        
        #将缺失值删除.以列方式
        drop_na_cloumns = titanic_survival.dropna(axis=1)
        #将 Age 和 Sex 中有na值的行 drop掉
        new_titanic_survival = titanic_survival.dropna(axis=0,subset=["Age","Sex"])
        
        
        #通过行号和列号定位具体值  第83行的 Age列
        row_index_83_age = titanic_survival.loc[83,"Age"]
        row_index_1000_pclass = titanic_survival.loc[766,"Pclass"]
        print(row_index_83_age)
        print(row_index_1000_pclass)
        
        #排完序之后的index还是原来的index  不会变
        new_titanic_survival = titanic_survival.sort_values("Age",ascending=False)
        print(new_titanic_survival)
        #将其index重新排列。drop = true 表示原来的 index 不要了 生成新的值
        titanic_reindexed = new_titanic_survival.reset_index(drop=True)
        print("-------------------")
        print(titanic_reindexed.loc[0:10])
    8.  
  3. 声明:这些代码中用到的文件吧,都是唐宇迪老师机器学习课程里面的csv文件。本人还是在校大学生一枚,辣鸡的很,假如(真的是加入)这篇文章有人看到的话,如有错误或侵权请私信给我 我即刻改正或删除,初入博客有做的不正确之处,请各位指正。

转载于:https://my.oschina.net/u/3900854/blog/1934879

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值