2 Pandas基础
我们学习pandas的基础操作,那么上一节通过pandas加载之后的数据,其数据类型是什么呢?
Pandas
中有两个数据类型DataFrame
和Series
。
Series
是一种类似于一维数组的对象。它由一组数据(各种Numpy
数据类型)以及一组与之相关的数据标签(即索引)组成,它只有行索引。
DataFrame
是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。
DataFrame
既有行索引也有列索引,它可以被看做由Series
组成的字典(共同用一个索引)。
2.1 任务一:pandas中有两个数据类型DateFrame和Series,通过查找简单了解他们。然后自己写一个关于这两个数据类型的小例子🌰[开放题]
import pandas as pd
example1_data = {'ABC': 35000, 'EFG': 71000, 'IJK': 16000, 'LMN': 5000}
example_1 = pd.Series(example1_data)
print(example_1)
print(type(example_1))
# ABC 35000
# EFG 71000
# IJK 16000
# LMN 5000
# dtype: int64
# <class 'pandas.core.series.Series'>
example2_data = {'name': ['ABC', 'EFG', 'HIJ', 'KLM', 'NLL', 'PKK'],
'year': [2000, 2001, 2002, 2001, 2002, 2003],'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
example_2 = pd.DataFrame(example2_data)
print(example_2)
print(type(example_2))
# name year pop
# 0 ABC 2000 1.5
# 1 EFG 2001 1.7
# 2 HIJ 2002 3.6
# 3 KLM 2001 2.4
# 4 NLL 2002 2.9
# 5 PKK 2003 3.2
# <class 'pandas.core.frame.DataFrame'>
2.2 任务二:根据上节课的方法载入"train.csv"文件
'''载入"train.csv"文件'''
df1 = pd.read_csv("train.csv")
2.3 任务三:查看DataFrame数据的每列的项
'''查看DataFrame数据的每列的项'''
print(df1.columns)
# Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
# 'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],
# dtype='object')
2.4任务四:查看"cabin"这列的所有项 [有多种方法]
'''查看"cabin"这列的所有项'''
print(df1['Cabin'].head(3))
# 0 NaN
# 1 C85
# 2 NaN
# Name: Cabin, dtype: object
print(df1.Cabin.head(3))
# 0 NaN
# 1 C85
# 2 NaN
# Name: Cabin, dtype: object
2.5 任务五:加载文件"test_1.csv",然后对比"train.csv",看看有哪些多出的列,然后将多出的列删除
经过我们的观察发现一个测试集test_1.csv有一列是多余的,我们需要将这个多余的列删去
【思考】还有其他的删除多余的列的方式吗?
del df[]
df.drop([],axis = 1)
# 例如
df.drop(['性别', '票价'],axis=1, inplace=True) # 删除多列
# inplace 是起了一个保存作用,如果没有它,就只是隐藏了列元而已
2.6 任务六: 将[‘PassengerId’,‘Name’,‘Age’,‘Ticket’]这几个列元素隐藏,只观察其他几个列元素
'''将['PassengerId',XXXXXX]这几个列元素隐藏,只观察其他几个列元素'''
print(df1.drop(['PassengerId', 'Survived', 'Pclass'],axis=1).head(3))
# Name Sex ... Cabin Embarked
# 0 Braund, Mr. Owen Harris male ... NaN S
# 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female ... C85 C
# 2 Heikkinen, Miss. Laina female ... NaN S
#
# [3 rows x 9 columns]
print(df1.head(3))
# PassengerId Survived Pclass ... Fare Cabin Embarked
# 0 1 0 3 ... 7.2500 NaN S
# 1 2 1 1 ... 71.2833 C85 C
# 2 3 1 3 ... 7.9250 NaN S
#
# [3 rows x 12 columns]
【思考】对比任务五和任务六,是不是使用了不一样的方法(函数),如果使用一样的函数如何完成上面的不同的要求呢?
【思考回答】
如果想要完全的删除你的数据结构,使用inplace=True,因为使用inplace就将原数据覆盖了,所以这里没有用
筛选的逻辑
表格数据中,最重要的一个功能就是要具有可筛选的能力,选出我所需要的信息,丢弃无用的信息。
下面我们还是用实战来学习pandas这个功能。
2.7 任务一: 我们以"Age"为筛选条件,显示年龄在10岁以下的乘客信息。
2.8 任务二: 以"Age"为条件,将年龄在10岁以上和50岁以下的乘客信息显示出来,并将这个数据命名为midage
'''我们以"Age"为筛选条件,显示年龄在10岁以下的乘客信息。'''
print(df1[df1["Age"]<10].head(3))
# PassengerId Survived Pclass ... Fare Cabin Embarked
# 7 8 0 3 ... 21.075 NaN S
# 10 11 1 3 ... 16.700 G6 S
# 16 17 0 3 ... 29.125 NaN Q
#
# [3 rows x 12 columns]
'''以"Age"为条件,将年龄在10岁以上和50岁以下的乘客信息显示出来,并将这个数据命名为midage'''
midage = df1[(df1["Age"]>10)& (df1["Age"]<50)]
print(midage.head(3))
# PassengerId Survived Pclass ... Fare Cabin Embarked
# 0 1 0 3 ... 7.2500 NaN S
# 1 2 1 1 ... 71.2833 C85 C
# 2 3 1 3 ... 7.9250 NaN S
#
# [3 rows x 12 columns]
【提示】了解pandas的条件筛选方式以及如何使用交集和并集操作
midage = df[(df["年龄"] > 50) | (df["年龄"] < 20)] # 并集
midage = df[(df["年龄"] > 50) & (df["年龄"] < 20)] # 交集
**2.9 任务三:将midage的数据中第100行的"Pclass"和"Sex"的数据显示出来
print(midage.loc[[100],['Pclass','Sex']])
# Pclass Sex
# 100 3 female
midage = midage.reset_index()
print(midage.head(3))
# index PassengerId Survived ... Fare Cabin Embarked
# 0 0 1 0 ... 7.2500 NaN S
# 1 1 2 1 ... 71.2833 C85 C
# 2 2 3 1 ... 7.9250 NaN S
#
# [3 rows x 13 columns]
'''将midage的数据中第100行的"Pclass"和"Sex"的数据显示出来'''
midage = midage.reset_index(drop=True)
print(midage.head(3))
# PassengerId Survived Pclass ... Fare Cabin Embarked
# 0 1 0 3 ... 7.2500 NaN S
# 1 2 1 1 ... 71.2833 C85 C
# 2 3 1 3 ... 7.9250 NaN S
#
# [3 rows x 12 columns]
print(midage.loc[[100],['Pclass','Sex']])
# [3 rows x 12 columns]
# Pclass Sex
# 100 2 male
【思考】这个reset_index()函数的作用是什么?如果不用这个函数,下面的任务会出现什么情况?**
如果想要按索引筛选,需要重置索引
当你想取特定行特定列的元素时,你或许需要将之前设定的“乘客id”索引给删去,这样才能完成特定行的获取。
midage = midage.reset_index(drop=True)
'''
reset_index():
函数原型:DataFrame.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='')
参数解释:
- level:int、str、tuple或list,默认无,仅从索引中删除给定级别。默认情况下移除所有级别。
- drop:drop为False则索引列会被还原为普通列,否则会丢失
- inplace:默认为false,适当修改DataFrame(不要创建新对象)
- col_level:int或str,默认值为0,如果列有多个级别,则确定将标签插入到哪个级别。默认情况下,它将插入到第一级。
- col_fill:对象,默认‘’,如果列有多个级别,则确定其他级别的命名方式。如果没有,则重复索引名
'''
2.10 任务四:将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来
【提示】使用pandas提出的简单方式,你可以看看loc方法
对比整体的数据位置,你有发现什么问题吗?那么如何解决?
2.11 任务五:使用iloc方法将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来**
'''使用loc方法将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来'''
print(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
print(midage.iloc[[100, 105, 108], [2, 3, 4]]) # iloc不能直接通过列名获取数值,而是要写出第几列
# Survived Pclass Name
# 100 0 2 Byles, Rev. Thomas Roussel Davids
# 105 0 3 Cribb, Mr. John Hatfield
# 108 0 3 Calic, Mr. Jovo
总结:loc和iloc的区别:
loc:只能通过选取行标签索引数据;
iloc:只能通过选取行位置编号索引数据
[1]https://www.cnblogs.com/recoverableTi/p/13526941.html
[2]https://blog.youkuaiyun.com/weixin_41903171/article/details/108053159
[3]https://nbviewer.jupyter.org/github/andongBlue/hands-on-data-analysis/blob/master/%E7%AC%AC%E4%B8%80%E5%8D%95%E5%85%83%E9%A1%B9%E7%9B%AE%E9%9B%86%E5%90%88/%E7%AC%AC%E4%B8%80%E7%AB%A0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E8%8A%82pandas%E5%9F%BA%E7%A1%80.ipynb
[4]https://nbviewer.jupyter.org/github/andongBlue/hands-on-data-analysis/blob/master/%E7%AC%AC%E4%B8%80%E5%8D%95%E5%85%83%E9%A1%B9%E7%9B%AE%E9%9B%86%E5%90%88/%E7%AC%AC%E4%B8%80%E7%AB%A0%EF%BC%9A%E7%AC%AC%E4%BA%8C%E8%8A%82pandas%E5%9F%BA%E7%A1%80-%E8%AF%BE%E7%A8%8B.ipynb#1.4.4任务四:查看%22cabin%22这列的所有项-[有多种方法]