1. 磐创AI-开放猫官方网站首页
  2. 机器学习

Pandas教程

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

Pandas教程

作为每个数据科学家都非常熟悉和使用的最受欢迎和使用的工具之一,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()

Pandas教程

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

data.tail(7)

Pandas教程

基本信息:快速查看数据

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()

Pandas教程

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

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

Pandas教程

基本统计

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

data.describe()

Pandas教程

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

describe = data.describe()

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

Pandas教程

c) 显示分类数据。

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

等同于

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

等同于

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

Pandas教程

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

data.describe(include='all')

Pandas教程

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

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

Pandas教程

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

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

Pandas教程

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()默认情况下的皮尔逊相关性

Pandas教程

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]]

Pandas教程

b) 选择行数组。

data.loc[6:8]

Pandas教程

c) 选择几行。

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

Pandas教程

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

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

Pandas教程

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

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

Pandas教程

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

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

Pandas教程

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

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

Pandas教程

布尔索引:iloc

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

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

data.iloc[3]

Pandas教程

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

data.iloc[6:12]

Pandas教程

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

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

Pandas教程

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

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

Pandas教程

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

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

Pandas教程

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

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

Pandas教程

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,表示列。

Pandas教程

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()

Pandas教程

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]

Pandas教程

结束了

Pandas教程

结论

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

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

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

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

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

原创文章,作者:磐石,如若转载,请注明出处:https://panchuang.net/2020/10/19/pandas%e6%95%99%e7%a8%8b/

发表评论

登录后才能评论

联系我们

400-800-8888

在线咨询:点击这里给我发消息

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息