Datawhale组队学习 2022年1月 动手学数据分析 第1章2

上一部分
复习:数据分析的第一步,加载数据我们已经学习完毕了。当数据展现在我们面前的时候,我们所要做的第一步就是认识他,今天我们要学习的就是了解字段含义以及初步观察数据

1 第一章:数据载入及初步观察

1.4 知道你的数据叫什么

我们学习pandas的基础操作,那么上一节通过pandas加载之后的数据,其数据类型是什么呢?

开始前导入numpy和pandas

In [1]:

import numpy as np
import pandas as pd

1.4.1 任务一:pandas中有两个数据类型DateFrame和Series,通过查找简单了解他们。然后自己写一个关于这两个数据类型的小例子🌰[开放题]

pandas.Series类似DataFrame中的一个列,类似于一维数组或字典,可以保存任何数据类型,由索引和数据组成。

In [2]:

#用两个List构造Series
pd.Series(data=[5,3,7,2],index=[0,1,2,3])

Out[2]:

0    5
1    3
2    7
3    2
dtype: int64

In [3]:

#用一个字典构造Series
pd.Series({1:10,2:100,3:1000,4:10000})

Out[3]:

1       10
2      100
3     1000
4    10000
dtype: int64

摘抄自菜鸟教程:DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典。

DataFrame可以看作字段名到Series(列)的映射。此外,DataFrame还可以设置行索引,支持行操作。

DataFrame可以从二维List创建(可以单独指定字段名),也可以从字典创建。

In [4]:

#从二维List创建
pd.DataFrame(data=[['张三',100],['李四',150],['王五',116]],columns=['姓名','成绩'])

Out[4]:

姓名 成绩
0 张三 100
1 李四 150
2 王五 116

In [5]:

#从字典创建
pd.DataFrame(data={'姓名':['张三','李四','王五'],'成绩':[100,150,116]})

Out[5]:

姓名 成绩
0 张三 100
1 李四 150
2 王五 116

1.4.2 任务二:根据上节课的方法载入"train.csv"文件

In [6]:

#写入代码
df=pd.read_csv('train.csv')
pd.options.display.max_rows=2
df

Out[6]:

PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.25 NaN S
... ... ... ... ... ... ... ... ... ... ... ... ...
890 891 0 3 Dooley, Mr. Patrick male 32.0 0 0 370376 7.75 NaN Q

891 rows × 12 columns


也可以加载上一节课保存的"train_chinese.csv"文件。通过翻译版train_chinese.csv熟悉了这个数据集,然后我们对trian.csv来进行操作

1.4.3 任务三:查看DataFrame数据的每列的名称

DataFrame对象的columns属性存储了每列的名称。

In [7]:

#写入代码
df.columns

Out[7]:

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

1.4.4任务四:查看"Cabin"这列的所有值[有多种方法]

df['Cabin']df.Cabin能返回“Cabin”这列数据对应的Series对象。Series对象的values属性是一个numpy的数组对象,里面按顺序保存了所有值。

In [8]:

df.Cabin.values[0:5] #看看前5个值

Out[8]:

array([nan, 'C85', nan, 'C123', nan], dtype=object)

In [9]:

df['Cabin'].values[0:5]

Out[9]:

array([nan, 'C85', nan, 'C123', nan], dtype=object)

1.4.5 任务五:加载文件"test_1.csv",然后对比"train.csv",看看有哪些多出的列,然后将多出的列删除

经过我们的观察发现一个测试集test_1.csv有一列是多余的,我们需要将这个多余的列删去

In [10]:

#写入代码
test1Df=pd.read_csv('test_1.csv')
test1Df

Out[10]:

Unnamed: 0 PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked a
0 0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.25 NaN S 100
... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
890 890 891 0 3 Dooley, Mr. Patrick male 32.0 0 0 370376 7.75 NaN Q 100

891 rows × 14 columns


In [11]:

df.columns

Out[11]:

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

In [12]:

test1Df.columns

Out[12]:

Index(['Unnamed: 0', 'PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age',
       'SibSp', 'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked', 'a'],
      dtype='object')

对比发现train.csvtest_1.csv少2列:第一列从0开始的Unnamed: 0索引列,最后一列a

有两种方法可以删除多余列:

  1. 调用DataFrame对象的drop方法
  2. 使用del

In [13]:

# 使用drop方法
# inplace参数用来确定是否在原对象上修改,这里使用默认值False,便于之后展示第二种方法
# 要将修改保存回原对象,可以把inplace参数设置为True,或把结果赋值回去(test1Df=test1Df.drop('a',axis=1))
test1Df.drop('a',axis=1) #axis参数为1表示删除列

Out[13]:

Unnamed: 0 PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.25 NaN S
... ... ... ... ... ... ... ... ... ... ... ... ... ...
890 890 891 0 3 Dooley, Mr. Patrick male 32.0 0 0 370376 7.75 NaN Q

891 rows × 13 columns


In [14]:

#使用del
del test1Df['a'] # 这里不能换用test1Df.a
test1Df

Out[14]:

Unnamed: 0 PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.25 NaN S
... ... ... ... ... ... ... ... ... ... ... ... ... ...
890 890 891 0 3 Dooley, Mr. Patrick male 32.0 0 0 370376 7.75 NaN Q

891 rows × 13 columns


1.4.6 任务六: 将['PassengerId','Name','Age','Ticket']这几个列元素隐藏,只观察其他几个列元素

有两种方法可以实现“隐藏”某几列:

  1. 使用style属性的hide_columns方法,会返回一个隐藏了特定列的Styler对象,直接展示。
  2. 使用DataFrame对象的drop方法,把inplace参数设置为False,生成删除特定列的副本,展示这个副本。

In [15]:

# 使用style.hide_columns
df.style.hide_columns(['PassengerId','Name','Age','Ticket'])

Styler对象在jupyter notebook中会全部展示,速度较慢。下面Out[15]的省略是为了避免浪费篇幅,手动修改的。

Out[15]:

Survived Pclass Sex SibSp Parch Fare Cabin Embarked
0 0 3 male 1 0 7.250000 nan S
1 1 1 female 1 0 71.283300 C85 C
2 1 3 female 0 0 7.925000 nan S
... ... ... ... ... ... ... ... ...
888 0 3 female 1 2 23.450000 nan S
889 1 1 male 0 0 30.000000 C148 C
890 0 3 male 0 0 7.750000 nan Q

In [16]:

# 使用drop方法
df.drop(['PassengerId','Name','Age','Ticket'],axis=1,inplace=False)

Out[16]:

Survived Pclass Sex SibSp Parch Fare Cabin Embarked
0 0 3 male 1 0 7.25 NaN S
... ... ... ... ... ... ... ... ...
890 0 3 male 0 0 7.75 NaN Q

891 rows × 8 columns


1.5 筛选的逻辑

表格数据中,最重要的一个功能就是要具有可筛选的能力,选出我所需要的信息,丢弃无用的信息。

下面我们还是用实战来学习pandas这个功能。

【提示】了解pandas的条件筛选方式以及如何使用交集和并集操作

1.5.1 任务一: 我们以"Age"为筛选条件,显示年龄在10岁以下的乘客信息。

In [17]:

df[df.Age<10]

Out[17]:

PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
7 8 0 3 Palsson, Master. Gosta Leonard male 2.0 3 1 349909 21.0750 NaN S
... ... ... ... ... ... ... ... ... ... ... ... ...
869 870 1 3 Johnson, Master. Harold Theodor male 4.0 1 1 347742 11.1333 NaN S

62 rows × 12 columns


1.5.2 任务二: 以"Age"为条件,将年龄在10岁以上和50岁以下的乘客信息显示出来,并将这个数据命名为midage

In [18]:

midage=df[(df.Age>10) & (df.Age<50)]
midage

Out[18]:

PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.25 NaN S
... ... ... ... ... ... ... ... ... ... ... ... ...
890 891 0 3 Dooley, Mr. Patrick male 32.0 0 0 370376 7.75 NaN Q

576 rows × 12 columns


1.5.3 任务三:将midage的数据中第100行的"Pclass"和"Sex"的数据显示出来

这里要求第100行,如果用loc[100],会选中原始数据中索引为100的行,而非第100行,所以要用iloc

另外,iloc的第一个参数应该为99,因为iloc从0开始给行标号,第二个参数应该是[2,4],因为iloc只支持整数类型的参数,不能通过字段名选择列,要通过字段名在df.columns中的下标来选择。

In [19]:

midage.iloc[[99],[2,4]] # 这里把99包装成List,可以在jupyter notebook中显示更美观的表格,而不是单纯文字

Out[19]:

Pclass Sex
148 2 male

1.5.4 任务四:使用loc方法将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来

这里要求使用loc方法选出所需行,但loc只能根据原始索引寻址,所以需要先修改索引,让索引和行号挂钩。

现在midage长下面这样:

In [20]:

midage

Out[20]:

PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.25 NaN S
... ... ... ... ... ... ... ... ... ... ... ... ...
890 891 0 3 Dooley, Mr. Patrick male 32.0 0 0 370376 7.75 NaN Q

576 rows × 12 columns


先用reset_index方法删除之前的索引(即最左边没写名字那列),设置参数drop=True,表示把之前的索引列删除,否则之前的索引列会被命名成index,塞回到数据中,如下所示:

In [21]:

midage.reset_index() # 由于inplace参数为默认值False,这里展示的只是被修改的副本,原始数据没有改变,不需要恢复。

Out[21]:

index PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.25 NaN S
... ... ... ... ... ... ... ... ... ... ... ... ... ...
575 890 891 0 3 Dooley, Mr. Patrick male 32.0 0 0 370376 7.75 NaN Q

576 rows × 13 columns


下面是修改索引后完成任务的代码。

In [22]:

pd.options.display.max_rows=10
midage.reset_index(drop=True).loc[[99,104,107],['Pclass','Name','Sex']]

Out[22]:

Pclass Name Sex
99 2 Navratil, Mr. Michel ("Louis M Hoffman") male
104 3 Corn, Mr. Harry male
107 3 Bengtsson, Mr. John Viktor male

1.5.5 任务五:使用iloc方法将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来

In [23]:

newMidage=midage.reset_index(drop=True)
col=list(newMidage.columns) # 用于寻找所需字段的下标
newMidage.iloc[[99,104,107],[col.index('Pclass'),col.index('Name'),col.index('Sex')]]

Out[23]:

Pclass Name Sex
99 2 Navratil, Mr. Michel ("Louis M Hoffman") male
104 3 Corn, Mr. Harry male
107 3 Bengtsson, Mr. John Viktor male

【总结】数据的加载以及入门,接下来就要接触数据本身的运算,我们将主要掌握numpy和pandas在工作和项目场景的运用。

下一部分

posted @ 2022-01-11 23:54  wawcac  阅读(98)  评论(0编辑  收藏  举报