zoukankan      html  css  js  c++  java
  • Pandas教程

    作者|Gonçalo Guimarães Gomes
    编译|VK
    来源|Towards Datas Science

    作为每个数据科学家都非常熟悉和使用的最受欢迎和使用的工具之一,Pandas库在数据操作、分析和可视化方面非常出色

    为了帮助你完成这项任务并对Python编码更加自信,我用Pandas上一些最常用的函数和方法创建了本教程。我真心希望这对你有用。

    目录

    1. 导入库

    2. 导入/导出数据

    3. 显示数据

    4. 基本信息:快速查看数据

    5. 基本统计

    6. 调整数据

    7. 布尔索引:loc

    8. 布尔索引:iloc

    9. 基本处理数据

    我们将研究“泰坦尼克号”的数据集,主要有两个原因:(1)很可能你已经对它很熟悉了;(2)它非常小,很简单

    泰坦尼克号的数据集可以在这里下载:https://bit.ly/33tOJ2S

    导入库

    为了我们的目的,“Pandas”库是必须导入的

    import pandas as pd
    

    导入/导出数据

    “泰坦尼克号数据集”指定为“data”。

    a) 使用read_csv将csv文件导入。你应该在文件中添加数据的分隔符。

    data = pd.read_csv("file_name.csv", sep=';')
    

    b) 使用read_excel从excel文件读取数据。

    data = pd.read_excel('file_name.xls')
    

    c) 将数据帧导出到csv文件,使用to_csv

    data.to_csv("file_name.csv", sep=';', index=False)
    

    d) 使用“to_excel”将数据框导出到excel文件。

    data.to_excel("file_name.xls´)
    

    显示数据

    a) 正在打印前n行。如果没有给定,则默认显示5行。

    data.head()
    

    b) 打印最后“n”行。下面,显示最后7行。

    data.tail(7)
    

    基本信息:快速查看数据

    a) 显示数据集的维度:总行数、列数。

    data.shape
    

    (891,12)

    b) 显示变量类型。

    data.dtypes
    
    PassengerId      int64
    Survived         int64
    Pclass           int64
    Name            object
    Sex             object
    Age            float64
    SibSp            int64
    Parch            int64
    Ticket          object
    Fare           float64
    Cabin           object
    Embarked        object
    dtype: object
    

    c) 按升序值显示变量类型。

    data.dtypes.sort_values(ascending=True)
    
    PassengerId      int64
    Survived         int64
    Pclass           int64
    SibSp            int64
    Parch            int64
    Age            float64
    Fare           float64
    Name            object
    Sex             object
    Ticket          object
    Cabin           object
    Embarked        object
    dtype: object
    

    d) 按类型对变量计数。

    data.dtypes.value_counts()
    
    object     5
    int64      5
    float64    2
    dtype: int64
    

    e) 按升序值对每种类型计数。

    data.dtypes.value_counts(ascending=True)
    
    float64    2
    int64      5
    object     5
    dtype: int64
    

    f) 以绝对值检查生存者与非生存者的数量。

    data.Survived.value_counts()
    
    0    549
    1    342
    Name: Survived, dtype: int64
    

    g) 检查特征的比例,以百分比表示。

    data.Survived.value_counts() / data.Survived.value_counts().sum()
    

    与以下相同:

    data.Survived.value_counts(normalize=True)
    
    0    0.616162
    1    0.383838
    Name: Survived, dtype: float64
    

    h) 检查特征的比例,以百分比表示,四舍五入。

    data.Survived.value_counts(normalize=True).round(decimals=4) * 100
    
    0    61.62
    1    38.38
    Name: Survived, dtype: float64
    

    i) 评估数据集中是否存在缺失值。

    data.isnull().values.any()
    
    True
    

    j) 使用isnull()得到缺失值的数目。

    data.isnull().sum()
    
    PassengerId      0
    Survived         0
    Pclass           0
    Name             0
    Sex              0
    Age            177
    SibSp            0
    Parch            0
    Ticket           0
    Fare             0
    Cabin          687
    Embarked         2
    dtype: int64
    

    k) 使用notnull()得到现有值的数目。

    data.notnull().sum()
    
    PassengerId    891
    Survived       891
    Pclass         891
    Name           891
    Sex            891
    Age            714
    SibSp          891
    Parch          891
    Ticket         891
    Fare           891
    Cabin          204
    Embarked       889
    dtype: int64
    

    l) 按变量列出的缺失值的百分比(%)。

    data.isnull().sum() / data.isnull().shape[0] * 100
    

    等同于

    data.isnull().mean() * 100
    
    PassengerId     0.000000
    Survived        0.000000
    Pclass          0.000000
    Name            0.000000
    Sex             0.000000
    Age            19.865320
    SibSp           0.000000
    Parch           0.000000
    Ticket          0.000000
    Fare            0.000000
    Cabin          77.104377
    Embarked        0.224467
    dtype: float64
    

    m) 四舍五入(在示例中为2)。

    (data.isnull().sum() / data.isnull().shape[0] * 100).round(decimals=2)
    

    等同于

    (data.isnull().mean() * 100).round(decimals=2)
    
    PassengerId     0.00
    Survived        0.00
    Pclass          0.00
    Name            0.00
    Sex             0.00
    Age            19.87
    SibSp           0.00
    Parch           0.00
    Ticket          0.00
    Fare            0.00
    Cabin          77.10
    Embarked        0.22
    dtype: float64
    

    n) 另外:用组合文本打印结果。

    print("The percentage of 'Age' is missing values:",(data.Age.isnull().sum() / data.Age.isnull().shape[0] * 100).round(decimals=2), "%")
    
    The percentage of 'Age' is missing values: 19.87 %
    
    print(f"The feature 'Age' has {data.Age.isnull().sum()} missing values")
    
    The feature 'Age' has 177 missing values
    
    print("'Age' has {} and 'Cabin' has {} missing values".format(data.Age.isnull().sum(), data.Cabin.isnull().sum()))
    
    'Age' has 177 and 'Cabin' has 687 missing values
    

    o) 形状、变量类型和缺失值的信息。

    data.info()
    

    p) 具体特征概述(下例中为“性别”和“年龄”)。

    data[['Sex','Age']].info()
    

    基本统计

    a) describe方法只给出数据的基本统计信息。默认情况下,它只计算数值数据的主统计信息。结果用pandas数据帧表示。

    data.describe()
    

    b) 添加其他非标准值,例如“方差”。

    describe = data.describe()
    
    describe.append(pd.Series(data.var(), name='variance'))
    

    c) 显示分类数据。

    data.describe(include=["O"])
    

    等同于

    data.describe(exclude=['float64','int64'])
    

    等同于

    data.describe(include=[np.object])
    

    d) 通过传递参数include='all',将同时显示数字和非数字数据。

    data.describe(include='all')
    

    e) 别忘了通过在末尾添加.T来转置数据帧。这也是一个非常有用的技巧

    data.describe(include='all').T
    

    f) 百分位数1%、5%、95%、99%。正如预期的那样,它将只计算数字特征的统计信息。

    data.quantile(q=[.01, .05, .95, .99])
    

    g) 摘要统计

    • 显示某些特征的唯一值。
    data.Embarked.unique()
    
    array(['S', 'C', 'Q', nan], dtype=object)
    
    • 计算某个特征的唯一值的总和。
    data.Sex.nunique()
    
    2
    
    • 计算总值
    data.count()
    
    PassengerId    891
    Survived       891
    Pclass         891
    Name           891
    Sex            891
    Age            714
    SibSp          891
    Parch          891
    Ticket         891
    Fare           891
    Cabin          204
    Embarked       889
    dtype: int64
    
    • 某些特征的最大值
    data.Age.max()
    
    80.0
    
    • 某些特征的最小值
    data.Age.min()
    
    0.42
    
    • 某些特征的平均值
    data.Age.mean()
    
    29.69911764705882
    
    • 某些特征的中值
    data.Age.median()
    
    28.0
    
    • 某些特征的第99分位数
    data.Age.quantile(q=[.99])
    
    0.99    65.87
    Name: Age, dtype: float64
    
    • 某些特征的标准差
    data.Age.std()
    
    14.526497332334044
    
    • 某些特征的方差
    data.Age.var()
    
    211.0191247463081
    

    h)额外

    问题1-显示分类特征“Embarked”最常见的两个值。

    data[‘Embarked’].value_counts().head(2)
    
    S    644
    C    168
    Name: Embarked, dtype: int64
    

    问题2-“Embarked”的百分比最高是多少?

    top_unique = data['Embarked'].value_counts(normalize=True)[0]
    
    print(f'{top_unique:.2%}')
    
    72.44%
    

    i) 变量之间的相关性。正如预期的那样,它将只显示数值数据的统计信息。

    data.corr()默认情况下的皮尔逊相关性

    J) 所选变量(示例中为“Survived”)与其他变量之间的相关性。

    correlation = data.corr()
    
    correlation.Survived.sort_values().sort_values(ascending=False) # 有序值
    
    Survived       1.000000
    Fare           0.257307
    Parch          0.081629
    PassengerId   -0.005007
    SibSp         -0.035322
    Age           -0.077221
    Pclass        -0.338481
    Name: Survived, dtype: float64
    

    调整数据

    a) 列出列的名称。

    data.columns
    
    Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp', 'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'], dtype='object')
    

    b) 重命名某些列(在下面的示例中,将“PassengerId”改为“id”)。

    data.rename(columns = {data.columns[0]:'id'}, inplace=True)
    

    等同于

    data.rename(columns = {'PassengerId':'id'}, inplace=True)
    
    Index(['id', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp', 'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'], dtype='object')
    

    c) 重命名多个列(“PassengerId”、“Pclass”和“SibSp”)。

    data.rename(columns = {'PassengerId':'Passenger_Id', 'Pclass':'P_Class', 'SibSp':'Sib_Sp'}, inplace=True)
    
    Index(['Passenger_Id', 'Survived', 'P_Class', 'Name', 'Sex', 'Age', 'Sib_Sp', 'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'], dtype='object')
    

    d) 通过列表生成式将下划线替换为点(仅适用于“Passenger.Id”、“P.Class”和“Sib.Sp”)。

    data.columns = [x.lower().replace('.', '') for x in data.columns]
    
    Index(['passengerid', 'survived', 'pclass', 'name', 'sex', 'age', 'sibsp', 'parch', 'ticket', 'fare', 'cabin', 'embarked'], dtype='object')
    

    e) 小写化字符并删除点(应用于'Passenger.Id','P.Class'和'Sib.Sp')。

    data.columns = [x.lower().replace('.', '') for x in data.columns]
    
    Index(['passengerid', 'survived', 'pclass', 'name', 'sex', 'age', 'sibsp', 'parch', 'ticket', 'fare', 'cabin', 'embarked'], dtype='object')
    

    f) 将列名称大写。

    data.columns = [x.capitalize() for x in data.columns]
    
    Index(['Passengerid', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'Sibsp', 'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'], dtype='object')
    

    布尔索引:loc

    data.loc[<lines>, <columns>],按列名称选择

    a) 选择行。

    data.loc[[3]]
    

    b) 选择行数组。

    data.loc[6:8]
    

    c) 选择几行。

    data.loc[[7,28,39]]
    

    d) 从“Name”、“Age”、“Sex”和“Survived”几个列中选择一行。

    data.loc[[7], ['Name', 'Age', 'Sex', 'Survived']]
    

    e) 从多个列中选择多行。

    data.loc[[7,28,39], ['Name', 'Age', 'Sex','Survived']]
    

    f) 在某些条件下使用loc选择特定值。在这种情况下,从第4行到第10行选择年龄大于或等于10岁的乘客。

    data.loc[4:10, ['Age']] >= 10
    

    g) 在某些条件下使用loc选择特定值。在这种情况下,从前5行选择乘坐C123客舱的乘客。

    data.loc[:4, ['Cabin']] == 'C123'
    

    布尔索引:iloc

    data.iloc[<lines>, <columns>]按数字选择行和列

    a) 选择数据集的第4行。

    data.iloc[3]
    

    b) 从所有列中选择一个行数组。

    data.iloc[6:12]
    

    c) 从所有列中选择几行。

    data.iloc[[7,28,39],:]
    

    d) 从“Name”、“Age”、“Sex”和“Survived”列中选择一行。

    data.iloc[[7], [3,5,4,1]]
    

    e) 从多个列中选择多行。

    data.iloc[[7,28,39], [3,5,4,1]]
    

    f) 选择多行形成列序列。

    data.iloc[[7,28,39], 3:10]
    

    g) 选择其他值。

    • 从第6行到第12行,最后一列。
    data.iloc[6:13, -1]
    
    • 第3列和第6列的所有行。
    data.iloc[:, [3,6]]
    
    • 7、28、39行,从第3列到第6列。
    data.iloc[[7,28,39], 3:7]
    
    • 最后一列的最后20行。
    data.iloc[-20:, -1:]
    

    基本处理数据

    • Axis = 0,表示行,如果未指定,默认为Axis=0。

    • Axis = 1,表示列。

    a) (删除nan值)。

    data.isnull().values.any()是否有丢失的数据?

    True
    

    如果没有将其分配到(新)变量中,则应该指定inplace=True,以便更改能生效。

    data.dropna(axis=0, inplace=True) #从行中删除nan
    
    data.isnull().values.any() #是否有丢失的数据?
    
    False
    

    b) 删除列

    data.drop(columns=['PassengerId', 'Name'], axis=1).head()
    

    c) value_counts也可以显示NaN值。

    data.Age.value_counts(dropna=False)
    
    NaN      177
    24.00     30
    22.00     27
    18.00     26
    28.00     25
            ... 
    36.50      1
    55.50      1
    66.00      1
    23.50      1
    0.42       1
    Name: Age, Length: 89, dtype: int64
    

    d) 替换丢失值

    • 创建新的数据帧,复制数据,以保持原始数据的完整性。
    new_df = data.copy()
    

    计算年龄平均值:

    new_df.Age.mean()
    
    29.69911764705882
    
    • 用数据的平均值填充NAN,并将结果分配给一个新列。
    new_df['Age_mean'] = new_df.Age.fillna(new_df.Age.mean())
    

    年龄的中值

    new_df.Age.median()
    
    28.0
    

    用数据的中值填充任意NAN,并将结果分配给一个新列。

    new_df['Age_median'] = new_df.Age.fillna(new_df.Age.median())
    
    • 验证结果
    new_df[['Age', 'Age_mean', 'Age_median']].isnull().sum()
    
    Age           177
    Age_mean        0
    Age_median      0
    dtype: int64
    

    显示第106至110行,以验证两个NAN示例的插补(第107和109行)。

    new_df[['Age', 'Age_mean', 'Age_median']][106:110]
    

    结束了

    结论

    我真诚地希望你觉得这个教程有用,因为它可以帮助你编写代码的开发。我将在将来更新它并将其链接到其他Python教程。

    原文链接:https://towardsdatascience.com/pandas-made-easy-the-guide-i-81834f075893

    欢迎关注磐创AI博客站:
    http://panchuang.net/

    sklearn机器学习中文官方文档:
    http://sklearn123.com/

    欢迎关注磐创博客资源汇总站:
    http://docs.panchuang.net/

  • 相关阅读:
    软件工程概论
    软件工程概论
    JAVA
    JAVA
    C#字符补位
    C#绘图双缓冲
    C#中IP地址转换为数值的方法
    C#并行编程-并发集合
    C#委托
    C#事件(event)解析
  • 原文地址:https://www.cnblogs.com/panchuangai/p/13822560.html
Copyright © 2011-2022 走看看