zoukankan      html  css  js  c++  java
  • Python数据分析-Day2-Pandas模块

    1、pandas简介

    Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。

    pandas是numpy库的更高级封装,pandas方法中很多是调用了numpy库的方法

    2、pandas基本操作

    1)文件读取

    import pandas

    food_info=pandas.read_csv("food_info.csv")

    print(type(food_info))

    print(food_info.dtypes)

    print(help(pandas.read_csv))

    output:

    <class 'pandas.core.frame.DataFrame'>  # DataFrame就是pandas的核心数据结构,类似矩阵结构;numpy的核心数据结构是ndarray,详情见上一章

    --------------
    NDB_No int64
    Shrt_Desc object  #pandas对字符型数据类型定义较为怪异,称之为 object类型,object=str
    Water_(g) float64
    Energ_Kcal int64
    Protein_(g) float64
    Lipid_Tot_(g) float64
    Ash_(g) float64
    Carbohydrt_(g) float64
    Fiber_TD_(g) float64
    Sugar_Tot_(g) float64
    Calcium_(mg) float64
    Iron_(mg) float64
    Magnesium_(mg) float64
    Phosphorus_(mg) float64
    Potassium_(mg) float64
    Sodium_(mg) float64
    Zinc_(mg) float64
    Copper_(mg) float64
    Manganese_(mg) float64
    Selenium_(mcg) float64
    Vit_C_(mg) float64
    Thiamin_(mg) float64
    Riboflavin_(mg) float64
    Niacin_(mg) float64
    Vit_B6_(mg) float64
    Vit_B12_(mcg) float64
    Vit_A_IU float64
    Vit_A_RAE float64
    Vit_E_(mg) float64
    Vit_D_mcg float64
    Vit_D_IU float64
    Vit_K_(mcg) float64
    FA_Sat_(g) float64
    FA_Mono_(g) float64
    FA_Poly_(g) float64
    Cholestrl_(mg) float64
    dtype: object
    --------------

    2)显示dataframe数据前几行:

    first_rows = food_info.head()  #pandas的数据格式下调用head方法,是读取该数据格式的数据包括表头,如果不写参数,默认读取前5行数据。
    print first_rows
    #print(food_info.head(3))

    3)显示dataframe数据尾几行:

    last_rows = food_info.tail()  #pandas的数据格式下调用tail方法,是读取该数据格式的数据包括表头,如果不写参数,默认读取后5行数据。
    print last_rows

    4)dataframe列名

    print food_info.columns  #打印dataframe数据类型下的各列列名。

    5)dataframe样本数和指标数

    print food_info.shape  #打印dataframe形状,几行几列,其中行数就是样本数,列数就是指标数。

    6)pandas取数据

    按样本(行)取数据:

    pandas数据读取相对麻烦,不像python或numpy那样简单。pandas需要调用一个函数,才能对相关数据进行读取。

    这个方法就是loc[]方法,如下

    print food_info.loc[0]#dataframe数据有一个特征,就是样本数和指标数的分离。无论什么数据在dataframe里指标数固定,这里的索引index=0,是对样本进行索引。

    output:  #所以这里取出的是样本1所对应的所有属性或指标。

    NDB_No 1001
    Shrt_Desc BUTTER WITH SALT
    Water_(g) 15.87
    Energ_Kcal 717
    Protein_(g) 0.85
    Lipid_Tot_(g) 81.11
    Ash_(g) 2.11
    Carbohydrt_(g) 0.06
    Fiber_TD_(g) 0
    Sugar_Tot_(g) 0.06
    Calcium_(mg) 24
    Iron_(mg) 0.02
    Magnesium_(mg) 2
    Phosphorus_(mg) 24
    Potassium_(mg) 24
    Sodium_(mg) 643
    Zinc_(mg) 0.09
    Copper_(mg) 0
    Manganese_(mg) 0
    Selenium_(mcg) 1
    Vit_C_(mg) 0
    Thiamin_(mg) 0.005
    Riboflavin_(mg) 0.034
    Niacin_(mg) 0.042
    Vit_B6_(mg) 0.003
    Vit_B12_(mcg) 0.17
    Vit_A_IU 2499
    Vit_A_RAE 684
    Vit_E_(mg) 2.32
    Vit_D_mcg 1.5
    Vit_D_IU 60
    Vit_K_(mcg) 7
    FA_Sat_(g) 51.368
    FA_Mono_(g) 21.021
    FA_Poly_(g) 3.043
    Cholestrl_(mg) 215
    Name: 0, dtype: object

    同样dataframe.loc[3:6]可以对pandas的数据进行切片,方法与python类似。

    想取任意数据的话,只需要把其对应的索引值传入就可以了。

    按指标(列)取数据:

    ndb_col = food_info["NDB_No"]  #在dataframe格式下,把列名作为索引传递给数据对象,就可以得到这一列的所有数据。
    print ndb_col

    如果想打印多列:

    columns = ["Zinc_(mg)", "Copper_(mg)"]  #先把想打印的列名组合成一个list格式
    zinc_copper = food_info[columns]    #然后一起传递给dataframe的数据对象,就可以多列打印了。
    print zinc_copper

    需求:在这些数据中,找出以‘g’为结尾的列名和整列数据

    col_names = food_info.columns.tolist()  # columns方法是提取列名,tolist方法是把列名转化成list格式
    gram_columns = []

    for c in col_names:  #遍历可迭代对象col_names
      if c.endswith("(g)"):  
        gram_columns.append(c)
    gram_df = food_info[gram_columns]  #把以“g”结尾的列名为索引代入dataframe对象,得出对应的多列数据。
    print(gram_df.head(3))

    7)pandas中的数据类型

    #object - For string values
    #int - For integer values
    #float - For float values
    #datetime - For time values
    #bool - For Boolean values
    #print(food_info.dtypes)

    3、pandas加减乘除的操作

    对整列的数据的操作,等价于对该列中每个元素进行对应的操作,与numpy类似。

    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"]
    这个两列相乘,是把两列中同一样本的不同数据对应相乘,把结果保存成一个新的列

    添加新属性,即添加新列:

    iron_grams = food_info["Iron_(mg)"] / 1000
    food_info["Iron_(g)"] = iron_grams

    添加有个前提,就是添加的数据样本数要和原dataframe样本数一致,即行数一样,直接用索引+赋值的方式添加即可。

    求某列的最大值:

    max_calories = food_info["Energ_Kcal"].max()

    首先定位好要求最大值的列,然后直接调用max方法,即可求出某列的最大值。

    4、pandas的排序操作

    food_info.sort_values("Sodium_(mg)", inplace=True)
    print food_info["Sodium_(mg)"]

    对dataframe数据结构调用sort_values方法即可排序,默认是从小到大排序。第一个参数是要对哪一个列进行排序,inplace是判断是新生成dataframe还是覆盖旧的。

    food_info.sort_values("Sodium_(mg)", inplace=True, ascending=False)
    print food_info["Sodium_(mg)"]

    需要降序排列时,要指定sort_values的参数ascending=False,ascending的意思是升序。这个值默认是True,给它改成False就是降序排列了。

    5、泰坦尼克号pandas处理实例

    1)数据导入

    import pandas as pd  
    import numpy as np    #一般我们用np代替numpy,用pd代替pandas
    titanic_survival = pd.read_csv("titanic_train.csv")  #读入csv文件  
    titanic_survival.head()  #显示头几个数据

    2)数据操作

    age = titanic_survival["Age"]  #选中Age这一列,并把它单独保存
    #print(age.loc[0:10])  #age这时候已经只有一列,就是刚刚选出来的,这时候调用loc函数,输入切片位置,就可以仅仅取出age中对应位置的数据了
    age_is_null = pd.isnull(age)  #isnull方法是判断该数据中数据位是不是为空,如果为空返回True,括号里传入需要判断的数据组
    #print age_is_null  
    age_null_true = age[age_is_null]  #把bool值作为索引传入,得到数据为空的那些数据
    #print age_null_true
    age_null_count = len(age_null_true)  #判断数据为空的个数
    print(age_null_count)

    3)null值的影响

    mean_age = sum(titanic_survival["Age"]) / len(titanic_survival["Age"])  #先对age这一列求和,然后除以age这一列的个数
    print mean_age

    output:

      Nan

    这种情况就是因为sum中有null空值,所以结果就会报错。

    4)null值的处理

    good_ages = titanic_survival["Age"][age_is_null == False]  #age_is_null==False是取出不是缺失值的数据
    #print good_ages
    correct_mean_age = sum(good_ages) / len(good_ages)
    print correct_mean_age

     当然求均值可以直接调用mean方法,如下

    correct_mean_age = titanic_survival["Age"].mean()
    print correct_mean_age  #这段代码的输出结果与上一段代码的结果完全一样。

    5)数据统计

    需求:求出每个不同等级的船舱的平均船票

    #mean fare for each class
    passenger_classes = [1, 2, 3]  #先设置船舱等级列表
    fares_by_class = {}  #建立一个空字典,准备存放不同船舱的平均船票数据
    for this_class in passenger_classes:  #遍历不同等级的船舱
    pclass_rows = titanic_survival[titanic_survival["Pclass"] == this_class]  #先取出船舱列,对比目前遍历等级取出对应等级船舱数据
    pclass_fares = pclass_rows["Fare"]  #在这类数据中,取出价格列
    fare_for_class = pclass_fares.mean()  #求该价格列的平均值
    fares_by_class[this_class] = fare_for_class  #以船舱等级为key值,平均fare为value值,存入字典中
    print fares_by_class  #打印字典

    pd自带的统计函数:pivot_table

    passenger_survival = titanic_survival.pivot_table(index="Pclass", values="Survived", aggfunc=np.mean)

    #index是以谁为基准统计,values是基准和谁之间的关系, aggfunc是要统计前两个参数之间的什么关系。
    print passenger_survival

    统计不同等级船舱的乘客的平均年龄:

    passenger_age = titanic_survival.pivot_table(index="Pclass", values="Age")#以pclass为基准统计,统计的值是age的平均值。aggfunc默认值为np.mean
    print(passenger_age)

    统计一个变量和其他两个量之间的关系:

    port_stats = titanic_survival.pivot_table(index="Embarked", values=["Fare","Survived"], aggfunc=np.sum)
    print(port_stats)

    #以embarked为基准,统计它和fare与survived的关系,统计的关系为求和。即在不同码头登船的人的总费用和总的获救数量。

    6)丢掉null值:dropna

    drop_na_columns = titanic_survival.dropna(axis=1)  #横向丢掉缺失数据的样本
    new_titanic_survival = titanic_survival.dropna(axis=0,subset=["Age", "Sex"])  #纵向去掉,age和sex这两列中如果有缺失值,去掉该样本。
    #print new_titanic_survival

    7)通过索引调取数据

    row_index_83_age = titanic_survival.loc[83,"Age"]  #通过索引调取数据,都需要使用loc函数,位置1输入样本序号,位置2输入对应的属性
    row_index_1000_pclass = titanic_survival.loc[1000,"Pclass"]
    print row_index_83_age
    print row_index_1000_pclass

    8)排序后重新设置索引

    new_titanic_survival = titanic_survival.sort_values("Age",ascending=False)  #以age为依据降序排列
    print new_titanic_survival[0:10]  #取新数据的前11个样本,即年龄最大的前11个样本
    itanic_reindexed = new_titanic_survival.reset_index(drop=True)  #对新的dataframe数据,调用reset_index重新设置索引,drop为true意思是删除原有index。
    print(titanic_reindexed.iloc[0:10])

    6、pd自定义函数

    1)例子1:

    def hundredth_row(column):  #首先定义一个函数
      hundredth_item = column.loc[99]  #函数内调用loc方法,使得程序返回第100个样本数据
      return hundredth_item  #用return把数据返还给调用该函数的位置 

    hundredth_row = titanic_survival.apply(hundredth_row)  #对dataframe数据调用apply方法里面传入之前定义的函数,即执行自定义函数的操作。
    print hundredth_row

    2)例子2:

    def not_null_count(column):  #定义一个函数,形参必须为column,名字可以任取,默认column处会以遍历的方式把每一列的列名都代入。
      column_null = pd.isnull(column)  #调用pd的isnull方法,遍历的判断每列中的所有数据是否是缺失状态
      null = column[column_null]  #把每列中缺失的样本赋值给null
      return len(null)    #遍历的方式返回每列中缺失值的数量

    column_null_count = titanic_survival.apply(not_null_count)  #对dataframe数据执行apply方法,直接调用自定义函数
    print column_null_count

    3)例子3:

    def which_class(row):
      pclass = row['Pclass']
      if pd.isnull(pclass):
        return "Unknown"
      elif pclass == 1:
        return "First Class"
      elif pclass == 2:
        return "Second Class"
      elif pclass == 3:
        return "Third Class"

    classes = titanic_survival.apply(which_class, axis=1)
    print classes

    4)例子4:

    def generate_age_label(row):  #定义一个函数,形参为row
      age = row["Age"]  #
      if pd.isnull(age):
        return "unknown"
      elif age < 18:
        return "minor"
      else:
        return "adult"

    age_labels = titanic_survival.apply(generate_age_label, axis=1)
    print age_labels

    7、series结构

    dataframe中的单独的一行或一列就叫做series结构。而dataframe就是相当于多个series组成的矩阵。

    series结构也是可以通过索引和切片进行定位的。

    通过索引拿出series的一个值,这个值的结构是ndarry,所以series由ndarray结构组成,所以pandas实际上是对numpy的更高级封装

    如果想生成一个series需要from pandas import Series,并且调用Series函数。对Series而言可以用数字也可以用字符作为它的索引值

    series的排序方法sorted方法和reindex方法等

    用add函数对两个series相加,如果维度相同,则对应位置相加

    dataframe结构也是可以设定str值为索引值的,如果这么设定了后,那么dataframe就有两个索引值了,数值和str值

    8、pandas画图

    pandas中有一类数据结构就是datetime,调用pd.to_datetime可以把非标准的时间格式转化为标准的时间格式。

    首先画图前要导入matplotlib.pyplot库 as plt

    plt.plot()  #画出图

    plt.show()  #展示画出的图

    plt.plot(x,y)  #x是x轴数据,y是y轴数据

    plt.plot()  #show方法不变

    plt.xticks(rotation = 45)  #让横轴ticks数据旋转45°

    plt.xlabel('')  #x轴的名称,y轴一样

    plt.title('')  #整个图的标题

    plt.show()  #当对横轴、纵轴还有标题设计好后,最后再调用plt.show()方法画图。

  • 相关阅读:
    Find the Smallest K Elements in an Array
    Count of Smaller Number
    Number of Inversion Couple
    Delete False Elements
    Sort Array
    Tree Diameter
    Segment Tree Implementation
    Java Programming Mock Tests
    zz Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)
    Algorithm about SubArrays & SubStrings
  • 原文地址:https://www.cnblogs.com/GavinSimons/p/7889529.html
Copyright © 2011-2022 走看看