机器学习基础:背景介绍与pandas对象的创建
编辑背景介绍
在对一个数据集做任何任务之前,我们都要对数据集做一个初步的数据分析。数据分析能够让我们理解这个数据集,找到可能的离群点并且能够弄清楚数据集中的哪些特征对于我们要做的应用是最重要的。
由于许多机器学习框架都是用Python
编写的,因此使用一个基于Python
的数据分析框架是十分必要的,Pandas
就是一款基于Python
的数据分析框架,因此我们需要学会并掌握它。Pandas
能够将许多类型的文件格式中的数据提取出来并转换为NumPy
矩阵的形式,这就与之前学习的NumPy
联合在了一起,方便了我们的处理。
在数据分析阶段,如果能够对数据集有一个直观的感受是再好不过的了。正所谓一图胜千言,画图工具包也是必不可少的,matplotlib
中的pyplot
就允许我们画出各种各样的图像,如折线图、盒图、柱状图等,甚至包括3-D图像,因此对于matplotlib
的学习也是必不可少的。
综上,可以得到学习的目标有:
- 学会使用
pandas
进行数据分析 - 学会
matplotlib.pyplot
绘制图像
存储数据的对象
在pandas
中,经常需要与一维数据和二维数据打交道。因此,它设计了两个对象分别用来保存上述类型的数据:Series
和DataFrame
。
1-D数据
创建Series
对象
使用pandas.Series
对象存储一维数据,经常将pandas.Series
简称为Series
。使用pandas.Series
的创建Series
对象,其构造函数没有必需的参数,都是一些关键词参数。其中data
关键词参数位于第一个,用来指名Series
对象里面存储的数据,如果为默认,则保存的数据为空。
其它的关键词参数有dtype
,用来手动转换保存在容器内的数据的类型。
series = pd.Series()
# Newline to separate series print statements
print('{}\n'.format(series))
series = pd.Series(5)
print('{}\n'.format(series))
series = pd.Series([1, 2, 3])
print('{}\n'.format(series))
series = pd.Series([1, 2.2]) # upcasting
print('{}\n'.format(series))
arr = np.array([1, 2])
series = pd.Series(arr, dtype=np.float32)
print('{}\n'.format(series))
series = pd.Series([[1, 2], [3, 4]])
print('{}\n'.format(series))
pandas.Series
对象,在创建时也支持向上转型,其转型规则与np.array
是相同的。
Series
的索引
每一个Series
中的数据都有一个索引,也称为标签。默认情况下是从0到n - 1的(n为数据的总个数)。可以使用关键词参数index
指定索引标签,传入的实参必须是一个list
或者np.array
类型的数据,长度必须和数据的长度要相同,且每一个值都必须是可哈希的(hashable
)数据
series = pd.Series([1, 2, 3], index=['a', 'b', 'c'])
print('{}\n'.format(series))
series = pd.Series([1, 2, 3], index=['a', 8, 0.3])
print('{}\n'.format(series))
使用字典创建Series
当使用Python
中的字典Directory
类型的数据创建Series
时,它会将字典中的key
作为对应的value
的索引标签。
series = pd.Series({'a':1, 'b':2, 'c':3})
print('{}\n'.format(series))
series = pd.Series({'b':2, 'a':1, 'c':3})
print('{}\n'.format(series))
2-D数据
pandas
的主要目的之一就是处理表格类数据,如:来自于表格或者电子表格的数据。这种表格类数据都是二维数据,因此,pandas
提供了DataFrame
对象来处理上述数据。
创建DataFrame
对象
使用pandas.DataFrame
构造函数创建DataFrame
对象,其参数与pandas.Series
是一致的,但是需要注意的是:Sereis
可以从标量创建,但是DataFrame
不可以。
此外,pandas.DataFrame
有一个额外的关键词参数叫做columns
,它表示了列的标签。
df = pd.DataFrame()
# Newline added to separate DataFrames
print('{}\n'.format(df))
df = pd.DataFrame([5, 6]) # regarding [5, 6] as a data of column.
print('{}\n'.format(df))
df = pd.DataFrame([[5,6]])
print('{}\n'.format(df))
df = pd.DataFrame([[5, 6], [1, 3]],
index=['r1', 'r2'],
columns=['c1', 'c2'])
print('{}\n'.format(df))
df = pd.DataFrame({'c1': [1, 2], 'c2': [3, 4]},
index=['r1', 'r2'])
print('{}\n'.format(df))
注意:当使用字典创建DataFrame
对象时,会把字典中的key
当作是列的标签来进行创建。
向上转型(Upcasting)
由于DataFrame
是二维的,因此,它是按照列中的数据来进行向上转型的。DataFrame
对象的dtypes
属性,返回的是每一列的数据类型作为Series
的数据类型。
upcast = pd.DataFrame([[5, 6], [1.2, 3]])
print('{}\n'.format(upcast))
# Datatypes of each column
print(upcast.dtypes)
追加行数据
可以使用DataFrame
中内置的append
函数来追加行数据,它的参数的数据类型可以是DataFrame
也可以是Series
,用来表示要追加的行数据。
注意:append
函数返回的是追加行数据后的结果,而不是真的在原始DataFrame
对象上进行修改。此外,当我们追加Series
到DataFrame
中时,要么需要给这一行Series
在创建时指定name
关键词参数作为这一行数据的标签,要么使用ignore_keyword
关键词参数。如果ignore_keyword=True
,那么就会将行标签转为整数索引值。
df = pd.DataFrame([[5, 6], [1.2, 3]])
ser = pd.Series([0, 0], name='r3')
df_app = df.append(ser)
print('{}\n'.format(df_app))
df_app = df.append(ser, ignore_index=True)
print('{}\n'.format(df_app))
df2 = pd.DataFrame([[0,0],[9,9]])
df_app = df.append(df2)
print('{}\n'.format(df_app))
丢弃数据
使用drop
函数可以丢弃某一列或者某一行的数据,它没有必需的参数,但是有一系列的关键词参数给了我们两种方式去丢弃行或者列数据。
第一种方式是指定label
关键词参数来丢弃指定的行或列数据,并且使用axis
指明丢弃的是行还是列数据(axis默认值为0,指的是删除行数据)。
第二种方式是通过index
或者columns
关键字参数来指定行数据的标签或者列数据的标签,而不需要使用axis
。
df = pd.DataFrame({'c1': [1, 2], 'c2': [3, 4],
'c3': [5, 6]},
index=['r1', 'r2'])
# Drop row r1
df_drop = df.drop(labels='r1')
print('{}\n'.format(df_drop))
# Drop columns c1, c3
df_drop = df.drop(labels=['c1', 'c3'], axis=1)
print('{}\n'.format(df_drop))
df_drop = df.drop(index='r2')
print('{}\n'.format(df_drop))
df_drop = df.drop(columns='c2')
print('{}\n'.format(df_drop))
df.drop(index='r2', columns='c2')
print('{}\n'.format(df_drop))
需要注意的是:drop
函数返回的也是结果,而不是对于原始数据进行修改。当同时使用index
和columns
参数时,我们不能从DataFrame
中同时删除行或列。
- 0
-
分享