Python大数据分析4:数据的更新

数据的更改主要包括三种常见的操作,比如更新、插入和删除。我们下面分别来介绍下:

先来看看更新操作。所谓更新,就是指修改现有的数据。比如我们准备修改所有的身高,都增加1厘米,方法很简单:

frame[‘height’] = frame[‘height’] + 0.01

这句话的准确理解是指将现有的身高列全部拿出来,各自加上0.01后,再更新回现有的身高列。于是,所有身高就变高了些。

其实这里的关键还是数据选择问题,我们选择的数据是什么,更新数据就是什么,所以大家可以把前面我们学习过的任何一种数据选择方法拿过来,就可以修改数据。

再比如,我们准备把第二条记录的姓名改为“赵春”,方法依然建立在准确的数据选择之上:

frame[1:2][‘name’] = ‘赵春’

此时可以更新成功。

但是细心的同学会发现,这时会有一个警告信息。警告不同于错误,只是可能的错误提示。为什么会有这个警告呢?主要原因在于这种写法其实进行了两次数据选择,因此在第二次选择列时,系统提示你目前是在第一次选择后的数据上进行的操作,可能与原始数据并不是同一个数据,更新会失败。当然这里其实没有问题。

因此更好的方法就是一步到位的定位:

frame.loc[1,’name’] = ‘赵春’

再看看插入数据。所谓插入数据就是指新增数据,既可以增加一列,也可以增加一行。比如我们增加一行,也就是一个学生记录:

data1 = {‘ID’: [‘000008’],

         ‘name’: [‘方文吾’],

         ‘gender’: [False],

         ‘age’: [21],

         ‘height’: [1.75]

         }

frame1 = pd.DataFrame(data1)

print(frame.append(frame1))

这里首先需要构造一个新的DataFrame,一条多条记录都可以,只需列结构一致即可。然后通过DataFrame类变量的append函数方法实现追加,

但是请注意,这个append只是临时性追加,如果要保存,需要显式的保存在DataFrame类变量中,如:

frame = frame.append(frame1)

这里比较奇怪的是新记录的索引号,虽然看起来是0,原因是从其他DataFrame中复制过来,但是实际上的序号仍然是7。

print(frame[7:8])

如果你希望在复制数据时不复制索引号,可以增加一个属性说明,即忽略复制过来的索引:

frame.append(frame1, ignore_index=True)

其实大家不用担心行之间的次序问题,这个问题称之为排序问题,以后可以专门处理,因此在增加数据时无需考虑行之间彼此的次序。

列也可以增加,增加时只需直接给出新增的列名及其每行对应的值:

frame[‘class’] = [‘C1’, ‘C2’, ‘A1’, ‘B2’, ‘C1’, ‘C1’, ‘C2’]

这里class列并不存在,不过没关系,系统会自动在最后一列后追加新列,并填充数据。

如果想在中间插入新的列,可以使用insert函数方法

frame.insert(0, ‘class’, [‘C1’, ‘C2’, ‘A1’, ‘B2’, ‘C1’, ‘C1’, ‘C2’])

这就表示在第1列前面插入一个新的第一列,第二个和第三个参数分别指定了列名称和对应的数值。

最后我们来看看删除。同样,删除也包含行删除和列删除,它们都使用drop函数。

比如通过索引号直接删除:

frame = frame.drop(1)

这些操作也都需要存储到DataFrame类变量才能保存。

也可以删除多条记录:

frame = frame.drop([1, 2])

其实这里默认的参数名称是index,也就是说默认以索引号,而不是序号来进行删除

frame = frame.drop(index=[1, 2])

通过设定columns参数可以指定删除列的名称

frame = frame.drop(columns=’name’)

除此以外,也可以不用指定这两个参数名称,而通过另外一个参数来指定删除的是行还是列。

frame = frame.drop(‘name’, axis=1)  # 删除列

frame = frame.drop(1, axis=0)  # 删除行

看的出来,axis参数默认为0。

最为灵活的方式是根据条件来删除行列,这个再次有依赖于前面学习的数据选择方法。

比如删除所有男生记录,即性别为True的记录:

frame = frame.drop(index=(frame.loc[(frame[‘gender’] == True)].index))

其中,frame.loc[(frame[‘gender’] == True)表示数据选择,

.index表示这些数据的索引信息,它也是DataFrame类变量中的一个属性,返回当前数据框架的所有索引号集合,与之类似的还有一个columns属性返回所有列的名称集合。

说明一下,这种条件也可以结合进数据更新和数据插入。我们来看两个例子:

比如我们准备将现有学生记录中年龄大于18岁的所有学生再次批量追加进现有数据中。

frame = frame.append(frame.loc[frame[‘age’] > 17])

这里的数据选择获取的数据直接作为append函数方法的参数,产生有条件的数据插入。

再如我们准备将所有身高大于1.80的学生年龄增加1岁。

frame.loc[frame[‘height’] > 1.80, ‘age’] = frame.loc[frame[‘height’] > 1.80, ‘age’] + 1

这些操作略显复杂,但是只要大家清楚前面学习的这些规则,就能理解。建议大家多练习。

在做练习之前,要注意一个关键问题,数据更改可能并不难,但是要想恢复并不容易,因此大家在进行任何数据更改的时候,都要想一想数据是否重要以及是否可以恢复。

发表评论

邮箱地址不会被公开。 必填项已用*标注