Datawhale组队学习 2022年1月 动手学数据分析 第1章2
上一部分
复习:数据分析的第一步,加载数据我们已经学习完毕了。当数据展现在我们面前的时候,我们所要做的第一步就是认识他,今天我们要学习的就是了解字段含义以及初步观察数据。
- 1 第一章:数据载入及初步观察
- 1.4 知道你的数据叫什么
- 1.4.1 任务一:pandas中有两个数据类型DateFrame和Series,通过查找简单了解他们。然后自己写一个关于这两个数据类型的小例子🌰[开放题]
- 1.4.2 任务二:根据上节课的方法载入"train.csv"文件
- 1.4.3 任务三:查看DataFrame数据的每列的名称
- 1.4.4任务四:查看"Cabin"这列的所有值[有多种方法]
- 1.4.5 任务五:加载文件"test_1.csv",然后对比"train.csv",看看有哪些多出的列,然后将多出的列删除
- 1.4.6 任务六: 将['PassengerId','Name','Age','Ticket']这几个列元素隐藏,只观察其他几个列元素
- 1.5 筛选的逻辑
- 1.4 知道你的数据叫什么
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.csv
比test_1.csv
少2列:第一列从0开始的Unnamed: 0
索引列,最后一列a
。
有两种方法可以删除多余列:
- 调用
DataFrame
对象的drop方法 - 使用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']这几个列元素隐藏,只观察其他几个列元素
有两种方法可以实现“隐藏”某几列:
- 使用
style
属性的hide_columns
方法,会返回一个隐藏了特定列的Styler
对象,直接展示。 - 使用
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在工作和项目场景的运用。