我的知识记录

digSelf

机器学习基础:背景介绍与pandas对象的创建

2021-11-01
机器学习基础:背景介绍与pandas对象的创建

背景介绍

在对一个数据集做任何任务之前,我们都要对数据集做一个初步的数据分析。数据分析能够让我们理解这个数据集,找到可能的离群点并且能够弄清楚数据集中的哪些特征对于我们要做的应用是最重要的。

由于许多机器学习框架都是用Python编写的,因此使用一个基于Python的数据分析框架是十分必要的,Pandas就是一款基于Python的数据分析框架,因此我们需要学会并掌握它。Pandas能够将许多类型的文件格式中的数据提取出来并转换为NumPy矩阵的形式,这就与之前学习的NumPy联合在了一起,方便了我们的处理。

在数据分析阶段,如果能够对数据集有一个直观的感受是再好不过的了。正所谓一图胜千言,画图工具包也是必不可少的,matplotlib中的pyplot就允许我们画出各种各样的图像,如折线图、盒图、柱状图等,甚至包括3-D图像,因此对于matplotlib的学习也是必不可少的。

综上,可以得到学习的目标有:

  • 学会使用pandas进行数据分析
  • 学会matplotlib.pyplot绘制图像

存储数据的对象

pandas中,经常需要与一维数据和二维数据打交道。因此,它设计了两个对象分别用来保存上述类型的数据:SeriesDataFrame

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对象上进行修改。此外,当我们追加SeriesDataFrame中时,要么需要给这一行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函数返回的也是结果,而不是对于原始数据进行修改。当同时使用indexcolumns参数时,我们不能从DataFrame中同时删除行或列。

  • 0