- 之前关于数据分析的学习是用到什么查阅什么,没有系统的学习过,最近通过这个机会,再复习下关于之前学过的数据分析的一些知识,并完善一些数据分析的方法.最近一系列的数据分析的内容来源于DataWhale开源.涉及到的数据集等可从github(https://github.com/datawhalechina/hands-on-data-analysis)上获取到.
复习:数据分析的第一步,加载数据我们已经学习完毕了。当数据展现在我们面前的时候,我们所要做的第一步就是认识他,今天我们要学习的就是了解字段含义以及初步观察数据。
本节涉及的知识点
- 1.如何定义DataFrame和Series
- 2.查看列、删除列
- 3.对某一列的数据进行筛选
- 4.loc和iloc
- 5.详情看目录
1 第一章:数据载入及初步观察
1.4 知道你的数据叫什么
我们学习pandas的基础操作,那么上一节通过pandas加载之后的数据,其数据类型是什么呢?
开始前导入numpy和pandas
import numpy as np
import pandas as pd
1.4.1 任务一:pandas中有两个数据类型DateFrame和Series,通过查找简单了解他们。然后自己写一个关于这两个数据类型的小例子🌰[开放题]
#写入代码
# Series以字典形式传入
series = pd.Series({'zhangsan':188,'lisi':150,'wangwu':178})
print(type(series))
series
<class 'pandas.core.series.Series'>
zhangsan 188
lisi 150
wangwu 178
dtype: int64
data = {
'name':['zhangsan','lisi','wangwu'],
'age':[18,38,50],
'height':[188,150,178]
}
dataframe = pd.DataFrame(data)
dataframe
name | age | height | |
---|---|---|---|
0 | zhangsan | 18 | 188 |
1 | lisi | 38 | 150 |
2 | wangwu | 50 | 178 |
1.4.2 任务二:根据上节课的方法载入"train.csv"文件
#写入代码
df = pd.read_csv("train.csv")
print(df.shapee)
df.head(3)
(891, 12)
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.2500 | NaN | S |
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
也可以加载上一节课保存的"train_chinese.csv"文件。通过翻译版train_chinese.csv熟悉了这个数据集,然后我们对trian.csv来进行操作
1.4.3 任务三:查看DataFrame数据的每列的名称
#写入代码
df.columns
Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],
dtype='object')
1.4.4任务四:查看"Cabin"这列的所有值[有多种方法]
#写入代码
df['Cabin'] # df['Cabin'].values|
0 NaN
1 C85
2 NaN
3 C123
4 NaN
...
886 NaN
887 B42
888 NaN
889 C148
890 NaN
Name: Cabin, Length: 891, dtype: object
#写入代码
# 这个之前没用过
df.Cabin
0 NaN
1 C85
2 NaN
3 C123
4 NaN
...
886 NaN
887 B42
888 NaN
889 C148
890 NaN
Name: Cabin, Length: 891, dtype: object
1.4.5 任务五:加载文件"test_1.csv",然后对比"train.csv",看看有哪些多出的列,然后将多出的列删除
经过我们的观察发现一个测试集test_1.csv有一列是多余的,我们需要将这个多余的列删去
#写入代码 -- 读取数据
test_1 = pd.read_csv("test_1.csv")
print(test_1.shape) # 14列数据 , train.csv有12列
test_1.head(3)
(891, 14)
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.2500 | NaN | S | 100 |
1 | 1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C | 100 |
2 | 2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S | 100 |
#写入代码 -- 删除 'a' 这一列
test_1.drop(columns=['a'],inplace=True)
print(test_1.shape)
test_1.head(3)
(891, 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.2500 | NaN | S |
1 | 1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
2 | 2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
【思考】还有其他的删除多余的列的方式吗?
# 思考回答
del test_1['a'] # 记住! 这种之前没用过!
1.4.6 任务六: 将[‘PassengerId’,‘Name’,‘Age’,‘Ticket’]这几个列元素隐藏,只观察其他几个列元素
#写入代码
# 这里不加columns=[] 也可以!
df.drop(['PassengerId','Name','Age','Ticket'],axis=1).head(3)
Survived | Pclass | Sex | SibSp | Parch | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|
0 | 0 | 3 | male | 1 | 0 | 7.2500 | NaN | S |
1 | 1 | 1 | female | 1 | 0 | 71.2833 | C85 | C |
2 | 1 | 3 | female | 0 | 0 | 7.9250 | NaN | S |
【思考】对比任务五和任务六,是不是使用了不一样的方法(函数),如果使用一样的函数如何完成上面的不同的要求呢?
【思考回答】
如果想要完全的删除你的数据结构,使用inplace=True,因为使用inplace就将原数据覆盖了,所以这里没有用
1.5 筛选的逻辑
表格数据中,最重要的一个功能就是要具有可筛选的能力,选出我所需要的信息,丢弃无用的信息。
下面我们还是用实战来学习pandas这个功能。
1.5.1 任务一: 我们以"Age"为筛选条件,显示年龄在10岁以下的乘客信息。
#写入代码
df['Age']<10 # 单纯输入 df["Age"]<10 是在做判断 ,并返回True/False
0 False
1 False
2 False
3 False
4 False
...
886 False
887 False
888 False
889 False
890 False
Name: Age, Length: 891, dtype: bool
df[df['Age']<10].head(3) # 在套一个df[]是将为True的值所对应的行筛选出来
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.075 | NaN | S |
10 | 11 | 1 | 3 | Sandstrom, Miss. Marguerite Rut | female | 4.0 | 1 | 1 | PP 9549 | 16.700 | G6 | S |
16 | 17 | 0 | 3 | Rice, Master. Eugene | male | 2.0 | 4 | 1 | 382652 | 29.125 | NaN | Q |
1.5.2 任务二: 以"Age"为条件,将年龄在10岁以上和50岁以下的乘客信息显示出来,并将这个数据命名为midage
#写入代码
# df[df['Age']>10 & df['Age']<50] -- 这样写不对,记住应该怎么写!!
# 这两个判别条件 要分别 加上()
midage = df[(df['Age']>10) & (df['Age']<50)]
midage.head(3)
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.2500 | NaN | S |
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
【提示】了解pandas的条件筛选方式以及如何使用交集和并集操作
1.5.3 任务三:将midage的数据中第100行的"Pclass"和"Sex"的数据显示出来
#写入代码
# 第一步 : 重置行索引
midage = midage.reset_index()
midage.loc[[100],['Pclass','Sex']]
Pclass | Sex | |
---|---|---|
100 | 2 | male |
midage.iloc[[100],[3,5]]
Pclass | Sex | |
---|---|---|
100 | 2 | male |
补充 : loc 和 iloc
- loc 是按照索引的值进行筛选
- iloc 是按照索引的下标进行筛选 – 看上面两个就能看出来
- 此外 在筛选的时候,可以进行如下筛选方式
midage.iloc[1,1] #获取第二行、第二列的值
2
midage.iloc[1:3,1:3]#获取从第二行,第二列开始的值 : 左闭右开!! ==> 获取不到 3 和 Pclass
PassengerId | Survived | |
---|---|---|
1 | 2 | 1 |
2 | 3 | 1 |
midage.loc[1,'PassengerId']#获取第二行(数值型)、第二列(字符串)对应的值
2
midage.loc[1:5,'PassengerId':'Sex'] # 这时候能获取到 5 和 Sex
PassengerId | Survived | Pclass | Name | Sex | |
---|---|---|---|---|---|
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female |
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female |
3 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female |
4 | 5 | 0 | 3 | Allen, Mr. William Henry | male |
5 | 9 | 1 | 3 | Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg) | female |
【提示】在抽取数据中,我们希望数据的相对顺序保持不变,用什么函数可以达到这个效果呢?
1.5.4 任务四:使用loc方法将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来
#写入代码
midage.loc[[100,105,108],["Pclass","Name","Sex"]]
Pclass | Name | Sex | |
---|---|---|---|
100 | 2 | Byles, Rev. Thomas Roussel Davids | male |
105 | 3 | Cribb, Mr. John Hatfield | male |
108 | 3 | Calic, Mr. Jovo | male |
1.5.5 任务五:使用iloc方法将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来
#写入代码
midage.iloc[[100,105,108],[3,4,5]]
Pclass | Name | Sex | |
---|---|---|---|
100 | 2 | Byles, Rev. Thomas Roussel Davids | male |
105 | 3 | Cribb, Mr. John Hatfield | male |
108 | 3 | Calic, Mr. Jovo | male |
【思考】对比iloc
和loc
的异同
- 就在上面刚刚总结le
# 补充 : 一个新的可能
# 说明了 加上[] 就能选取某几行/几列的数据 ,不加[]用 : 的方式可以回去 : 两侧之间的所有行/列的数据
midage.iloc[100:108,[3,4,5]]
Pclass | Name | Sex | |
---|---|---|---|
100 | 2 | Byles, Rev. Thomas Roussel Davids | male |
101 | 1 | Pears, Mrs. Thomas (Edith Wearne) | female |
102 | 3 | van Billiard, Mr. Austin Blyler | male |
103 | 3 | Gilnagh, Miss. Katherine "Katie" | female |
104 | 3 | Corn, Mr. Harry | male |
105 | 3 | Cribb, Mr. John Hatfield | male |
106 | 2 | Watt, Mrs. James (Elizabeth "Bessie" Inglis Mi... | female |
107 | 3 | Bengtsson, Mr. John Viktor | male |