先要有一个很简单的被命名为 data 的表:
第三列是一个名曰周杰伦的人历年来每个月的月薪,其中2016年月薪10万,纵观他历年来的月薪基本不超过3万(显然他不是我的偶像胖伦),因此对于这个人来说月薪10万是有些异常的。
有些人可能会说,这不简单?直接:【 data[monthly_pay] [data[monthly_pay] >= 10] = null 】就好了啊,可是你忘记了,周杰伦挣不了10万,可是库克完全没压力啊。你这么一句python运行下去,表里关于库克的月薪数据都要被删掉了。
那么,怎么识别到这个10万的数据,进而修改它呢?
我们采用每年和去年的月薪相比的方式,即:若今年的月薪超过去年的 2 倍,且去年的月薪在 5 万以下的,我们将修改今年的月薪为去年月薪的 2 倍值。
首先需要用 iterrows() 遍历这个表,找出异常值,然后修改就好了,下面是 python 代码:
# -*- coding:utf-8 -*-
import pandas as pd
import numpy as np
from pandas import DataFrame,Seriesdatafile = u'D:\\pythondata\\learn\\iterrows.xlsx'
data = pd.read_excel(datafile)
data = DataFrame(data)#首先将每一年对应的去年的月薪生成一列新的数据,匹配到最后一列
data_q1 = data[['name', 'year', 'monthly_pay']].copy()
data_q1['year'] = data['year']+1
data_q1.rename(columns={'monthly_pay':'monthly_pay_q1'}, inplace = True)
data = pd.merge(data, data_q1, how='left', left_on=['name','year'], right_on=['name','year'])for index,row in data.iterrows():if ((row['monthly_pay']) >= (2 * (row['monthly_pay_q1']))) & (row['monthly_pay_q1']<= 5):data.at[index, 'monthly_pay'] = (2 * (data.at[index,'monthly_pay_q1'])).astype(int)
data = data[['name', 'year', 'monthly_pay']]
更改后的data表:
iterrows()返回值为元组(index,row) ,for循环定义了两个变量,index, row,那么返回的元组(index,row),index=index,row=row。如果for循环中只定义一个变量 row ,则 row 就是整个元组。论方便的话还是定义两个变量吧。
很简单的功能对吧,代码也很简单,大神们就用不着了,新手们可以了解一下。
iterrows()的官网地址:
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.iterrows.htm