先要有一个很简单的被命名为 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,Series
datafile = 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
先要有一个很简单的被命名为 data 的表:第三列是一个名曰周杰伦的人历年来每个月的月薪,其中2016年月薪10万,纵观他历年来的月薪基本不超过3万(显然他不是我的偶像胖伦),因此对于这个人来说月薪10万是有些异常的。有些人可能会说,这不简单?直接:【 data[monthly_pay] [data[monthly_pay] &gt;= 10] = null 】就好了啊,可是你忘记了...
values = [1, 2, 3, 4, 5]
min_index, min_value = min(enumerate(values), key=operator.itemgetter(1))
max_index, max_value = max(enumerate(values), key=operato...
前几天在做决策树预测股票涨跌的小项目,里面要对
DataFrame
类型的变量
进行
迭代
修改
,我用的是it
erro
ws
的index和row
但是!测试了好久的
代码
,df的值始终没变化,一丁点都没有!
直到后来有篇帖子点到 row[" "]
修改
的值是临时的,不是对原数据直接
修改
!
这点很重要,就像C语言里传个整型参给函数(不是指针系列的),不论函数对它怎么
修改
,return后,这个变量的值压根不会改动
回到
python
,所以只要在
修改
语句的末尾添加:
results.iloc[index] = row
DataFrame
的
遍历
方式主要有三种
DataFrame
.it
erro
ws
()按行顺序优先,接着依次按列迭代
DataFrame
.iteritems()按列顺序优先,接着依次按行迭代
DataFrame
.itertuples()按行顺序优先,接着依次按列迭代下图的
DataFrame
沿用上一篇的示例。剧名,集數,主演,監製
"風雨晴Come Rain, Come Shine",20,石修、黃日華、苗僑偉...
对于 pandas.
DataFrame
有以下三种
遍历
方法
it
erro
ws
(): 按行
遍历
,将
DataFrame
的每一行迭代为 (index,
data
) 对,可以通过
data
[column_name] 和
data
.column_name对元素
进行
访问。
itertuples(): 按行
遍历
,将
DataFrame
的每一行迭代为元祖,可以通过
data
[ 列号数值 ] 和
data
.column_name对元素
进行
访问
iteritems():按列
遍历
,将
DataFrame
的每一列迭代为.
color_out_file = 'Color_V2.xlsx'
devices_out_file = 'Devices_V2.xlsx'
fixed_out_file = 'Devices_Fixed_Item_V2.xlsx'
other_out_file = 'Devices_Other_Item_V2.xlsx'
parameter_out_file = '.
1. 首先,可以使用pandas库读入
dataframe
数据,并针对两列的数据
进行
异常值
分析。
2. 可以通过绘制箱线图或直方图
进行
数据分布的可视化,查看是否存在
异常值
的出现。
3. 再可以根据统计学方法,如四分位数、标准差等计算方法,判断是否存在
异常值
,并标记它们的位置。
4. 最后,通过排除或替换
异常值
的方法,得到清洁的数据集,便于后续分析和建模。
异常值
处理
:
1. 首先,可以针对
异常值
进行
一些分析,找出其出现的原因,例如录入错误等。
2. 然后,可以根据非异常数据的均值、方差、最大值、最小值等统计量,对
异常值
进行
替换。
3. 替换的方法可以采用一些常用的方法,如
中
位数、平均数等
进行
替换。
4. 如果
异常值
较多或者替换后的数据不够准确,可能需要
进行
模型的重新训练或参数的调整。
以上是大概的思路,具体实现需根据数据情况、分析目的和实际需求
进行
调整。