作者|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      int64Survived         int64Pclass           int64Name            objectSex             objectAge            float64SibSp            int64Parch            int64Ticket          objectFare           float64Cabin           objectEmbarked        objectdtype: object

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

data.dtypes.sort_values(ascending=True)
PassengerId      int64Survived         int64Pclass           int64SibSp            int64Parch            int64Age            float64Fare           float64Name            objectSex             objectTicket          objectCabin           objectEmbarked        objectdtype: object

d) 按类型对变量计数。

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

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

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

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

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

g) 查看特色的比例,以百分比示意。

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

与以下雷同:

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

h) 查看特色的比例,以百分比示意,四舍五入。

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

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

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

j) 应用isnull()失去缺失值的数目。

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

k) 应用notnull()失去现有值的数目。

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

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

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

等同于

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

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

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

等同于

(data.isnull().mean() * 100).round(decimals=2)
PassengerId     0.00Survived        0.00Pclass          0.00Name            0.00Sex             0.00Age            19.87SibSp           0.00Parch           0.00Ticket          0.00Fare            0.00Cabin          77.10Embarked        0.22dtype: 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    891Survived       891Pclass         891Name           891Sex            891Age            714SibSp          891Parch          891Ticket         891Fare           891Cabin          204Embarked       889dtype: 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.87Name: Age, dtype: float64
  • 某些特色的标准差
data.Age.std()
14.526497332334044
  • 某些特色的方差
data.Age.var()
211.0191247463081

h)额定

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

data[‘Embarked’].value_counts().head(2)
S    644C    168Name: 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.000000Fare           0.257307Parch          0.081629PassengerId   -0.005007SibSp         -0.035322Age           -0.077221Pclass        -0.338481Name: 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) #从行中删除nandata.isnull().values.any() #是否有失落的数据?
False

b) 删除列

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

c) value_counts也能够显示NaN值。

data.Age.value_counts(dropna=False)
NaN      17724.00     3022.00     2718.00     2628.00     25        ... 36.50      155.50      166.00      123.50      10.42       1Name: 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           177Age_mean        0Age_median      0dtype: int64

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

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

完结了

论断

我真诚地心愿你感觉这个教程有用,因为它能够帮忙你编写代码的开发。我将在未来更新它并将其链接到其余Python教程。

原文链接:https://towardsdatascience.co...

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

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

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