复习:数据分析的第一步,加载数据我们已经学习完毕了。当数据展现在我们面前的时候,我们所要做的第一步就是认识他,今天我们要学习的就是了解字段含义以及初步观察数据。
1 第一章:数据载入及初步观察
1.4 知道你的数据叫什么
我们学习pandas的基础操作,那么上一节通过pandas加载之后的数据,其数据类型是什么呢?
开始前导入numpy和pandas
import numpy as np
import pandas as pd
1.4.1 任务一:pandas中有两个数据类型DateFrame和Series,通过查找简单了解他们。然后自己写一个关于这两个数据类型的小例子🌰[开放题]
Series
Series是一个,能够保存任何数据类型(整数、字符串、浮点数、Python 对象等)。轴标签统称为index。
创建系列的基本方法是调用:
s = pd.Series(data, index=index)
-
运算
- s1+s2 #索引相同的元素相加,不同的则补充Nan
- s * 2 #所有元素 * 2
- s+1 #所有元素+1
-
常用方法
- s.index #查看索引
- s.values #查看数值
- s.isnull() #查看为空的,返回布尔型
- s.notnull()
- s.sort_index() #按索引排序
- s.sort_values() #按数值排序
#写入代码
#创建Series
s = pd.Series(['a','b','c','d']) #默认索引
s
0 a
1 b
2 c
3 d
dtype: object
s = pd.Series(np.random.randn(5), index=["a", "b", "c", "d", "e"]) #指定索引
s
a 0.174499
b 0.826603
c -0.504941
d 1.154826
e 0.194536
dtype: float64
s = pd.Series({"b": 1, "a": 0, "c": 2}) #指定索引
s
b 1
a 0
c 2
dtype: int64
s = pd.Series(5.0, index=["a", "b", "c", "d", "e"]) #相同值
s
a 5.0
b 5.0
c 5.0
d 5.0
e 5.0
dtype: float64
#我们举的例子
sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}
example_1 = pd.Series(sdata)
example_1
Ohio 35000
Texas 71000
Oregon 16000
Utah 5000
dtype: int64
DataFrame
dataframe是非常常见的一个表格型数据结构,每一列可以是不同的数值类型,有行索引、列索引。提到它就会自然想到Pandas这个包。平常用Python处理xlsx、csv文件,读出来的就是dataframe格式。
DataFrame 接受多种不同类型的输入:
- 一维数组、列表、字典或系列的字典
- 二维 numpy.ndarray
- 结构化或记录ndarray
- 一种 Series
- 其他 DataFrame
#我们举的例子
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002, 2003],
'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
example_2 = pd.DataFrame(data)
example_2
d = {
"one": pd.Series([1.0, 2.0, 3.0], index=["a", "b", "c"]),
"two": pd.Series([1.0, 2.0, 3.0, 4.0], index=["a", "b", "c", "d"]),
"three": pd.Series([1.0, 2.0, 3.0, 5.0], index = ["a", "b", "c", "e"])
}
df = pd.DataFrame(d)
df
【VC小注】
可以看到,当规定的index数量、名称不一致时,会用NaN补齐表格
df = pd.DataFrame(d, index = ["b", "a", "e"], columns=["two", "three"])
df
【VC小注】
可以通过规定index、columns选取行/列组成表格
1.4.2 任务二:根据上节课的方法载入"train.csv"文件
#写入代码
data = pd.read_csv("train.csv")
data.head(5)
也可以加载上一节课保存的"train_chinese.csv"文件。通过翻译版train_chinese.csv熟悉了这个数据集,然后我们对trian.csv来进行操作
1.4.3 任务三:查看DataFrame数据的每列的名称
#写入代码
data.columns
Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],
dtype='object')
1.4.4任务四:查看"Cabin"这列的所有值[有多种方法]
【总结】查看列值的方法:
法一:df[列名]
法二:df.列名
#写入代码
data["Cabin"].head(5)
0 NaN
1 C85
2 NaN
3 C123
4 NaN
Name: Cabin, dtype: object
#写入代码
data.Cabin.head(5)
0 NaN
1 C85
2 NaN
3 C123
4 NaN
Name: Cabin, dtype: object
1.4.5 任务五:加载文件"test_1.csv",然后对比"train.csv",看看有哪些多出的列,然后将多出的列删除
经过我们的观察发现一个测试集test_1.csv有一列是多余的,我们需要将这个多余的列删去
#写入代码
df_test = pd.read_csv("test_1.csv")
df_test.columns
Index(['Unnamed: 0', 'PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age',
'SibSp', 'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked', 'a'],
dtype='object')
【总结】删除列:
法一:del df[列名]
法二:df.columns.delete(删除列的位置),若删除多列用[列1位置,……]
【注】 该方法不是真的删除了指定列,而是在输出结果上删除了指定列名,指定列数据仍然存在
#写入代码
del df_test[ 'a']
df_test.columns
Index(['Unnamed: 0', 'PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age',
'SibSp', 'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],
dtype='object')
df_test.columns.delete(-1)
Index(['Unnamed: 0', 'PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age',
'SibSp', 'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],
dtype='object')
df_test.columns
Index(['Unnamed: 0', 'PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age',
'SibSp', 'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked', 'a'],
dtype='object')
1.4.6 任务六: 将[‘PassengerId’,‘Name’,‘Age’,‘Ticket’]这几个列元素隐藏,只观察其他几个列元素
从行或列中删除指定的标签,采用以下语句:
DataFrame.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors=‘raise’)
#写入代码
data.drop(columns = ['PassengerId','Name','Age','Ticket'])
data.head(5)
可以看到,此处依然是全部列数,说明train_data本质并没有发生变化
drop操作后直接观察可以看到隐藏指定列的数据
data.drop(columns = ['PassengerId','Name','Age','Ticket']).head(5)
如果想要完全的删除数据,使用inplace=True ,因为使用inplace就将原数据覆盖了
1.5 筛选的逻辑
表格数据中,最重要的一个功能就是要具有可筛选的能力,选出我所需要的信息,丢弃无用的信息。
下面我们还是用实战来学习pandas这个功能。
1.5.1 任务一: 我们以"Age"为筛选条件,显示年龄在10岁以下的乘客信息。
df[筛选条件]
#写入代码
data[data["Age"]<10].head(5)
1.5.2 任务二: 以"Age"为条件,将年龄在10岁以上和50岁以下的乘客信息显示出来,并将这个数据命名为midage
使用 & 表示且
#写入代码
midage = data[(data["Age"]>10) & (data["Age"]<50)]
midage.head(5)
1.5.3 任务三:将midage的数据中第100行的"Pclass"和"Sex"的数据显示出来
【总结】索引:
法一:使用行名和列名,df.loc[[行名], [列名]]
法二:使用行序和列序,df.iloc[[行索引], [列索引]]
#写入代码
midage.loc[100,["Pclass", "Sex"]]
Pclass 3
Sex female
Name: 100, dtype: object
但是,因为midage是对原表筛选得到的,它的行名依然是原表的行名,即其与现表的索引不一定对应,故要对行索引进行更新,使用如下命令:
df.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill=’’)
其中,drop=True时,覆盖原索引进行更新;drop=False时,将原索引作为表格的一列数据,增加新索引
midage = midage.reset_index(drop = True)
midage
576 rows × 12 columns
midage.loc[100,["Pclass","Sex"]]
Pclass 2
Sex male
Name: 100, dtype: object
1.5.4 任务四:使用loc方法将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来
#写入代码
midage.loc[[100, 105, 108], ["Pclass", "Name", "Sex"]]
1.5.5 任务五:使用iloc方法将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来
#写入代码
midage.iloc[[100,105,108],[2,3,4]]