前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >pandas入门3-1:识别异常值以及lambda 函数

pandas入门3-1:识别异常值以及lambda 函数

作者头像
万能数据的小草
发布2020-02-17 17:12:10
6230
发布2020-02-17 17:12:10
举报
文章被收录于专栏:万能的小草

本节主要内容为识别异常值及lambda函数的应用,由于内容过长,故拆分为3-1和3-2两小节。

注意:确保您已查看过所有以前的课程,因为本练习需要学习以前课程中学到的知识。

# 导入相关的库

mport pandas as pd import matplotlib.pyplot as plt import numpy.random as np import sys import matplotlib print('Python version ' + sys.version) print('Pandas version: ' + pd.__version__) print('Matplotlib version ' + matplotlib.__version__)

运行结果如下:

Python version 3.6.5 |Anaconda, Inc.| (default, Apr 26 2018, 08:42:37)

[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)]

Pandas version: 0.23.0

Matplotlib version 2.2.2

创建测试数据进行分析。

# 设置种子

np.seed(111)

# 创建函数生成生成测试数据

def CreateDataSet(Number=1):

Output = []

for i in range(Number):

# 创建日期数据

rng = pd.date_range(start='1/1/2009', end='12/31/2012', freq='W-MON')

# 生成随机数据

data = np.randint(low=25,high=1000,size=len(rng))

# 状态池

status = [1,2,3]

# 生成一个随机的状态列表

random_status = [status[np.randint(low=0,high=len(status))] for i in range(len(rng))]

#州名池

states = ['GA','FL','fl','NY','NJ','TX']

# 生成一个随机的州名列表

random_states = [states[np.randint(low=0,high=len(states))] for i in range(len(rng))]

Output.extend(zip(random_states, random_status, data, rng))

return Output

#由State and StatusDate聚合操作 Daily = df.reset_index().groupby(['State','StatusDate']).sum() Daily.head()

运行结果如下:

Status CustomerCount State StatusDate FL 2009-01-19 1 495 2009-01-26 2 740 2009-02-09 1 128 2009-02-23 1 560 2009-03-02 1 28

现在有了生成测试数据的功能,让我们创建一些数据并将其保存为dataframe。

dataset = CreateDataSet(4)

df = pd.DataFrame(data=dataset, columns= ['State','Status','CustomerCount','StatusDate'])

df.info()

df.head()

运行结果如下:

State Status CustomerCount StatusDate

0 fl 3 828 2009-01-05

1 fl 3 344 2009-01-12

2 FL 2 671 2009-01-19

3 fl 1 268 2009-01-26

4 NY 3 535 2009-02-02

现在要将此dataframe保存到Excel文件中,然后再读取此文件。这样做,只是向您展示如何读取和写入Excel文件。我们不会将数据框的索引值写入Excel文件,因为它们不是我们初始测试数据集的一部分。

# 保存结果到excel

df.to_excel('Lesson3.xlsx', index=False) print('Done') #运行结果 #Done

从Excel中获取数据

注意:除非另有说明,否则Excel文件上的位置将与python notebook位于同一文件夹中。

#文件位置 Location = r'/Users/mac/Lesson3.xlsx' # 解析特定的sheet df = pd.read_excel(Location, 0, index_col='StatusDate') df.dtypes #运行结果 #State object #Status int64 #CustomerCount int64 #dtype: object df.head(5)

运行结果如下:

State Status CustomerCount StatusDate 2009-01-05 fl 3 828 2009-01-12 fl 3 344 2009-01-19 FL 2 671 2009-01-26 fl 1 268 2009-02-02 NY 3 535

准备数据

本节尝试清洗数据以进行分析。

  1. 确保state列全部为大写
  2. 仅选择帐户状态等于“1”的记录
  3. 在州列中合并NJ 和 NY( 即新泽西州和纽约州)到NY(纽约州)
  4. 删除任何异常值(数据集中的任何奇怪结果)

让我们快速看看哪些州名是大写的,哪些是小写的

df['State'].unique() #运行结果如下: #array(['fl', 'FL', 'NY', 'NJ', 'GA', 'TX'], dtype=object)

要将所有State值转换为大写,我们将使用upper()函数和dataframe的apply属性。

# 清洗州列,将其转为大写 df['State'] = df.State.apply(lambda x: x.upper()) df['State'].unique() #array(['FL', 'NY', 'NJ', 'GA', 'TX'], dtype=object) # 仅抓取Status == 1的数据 mask = df['Status'] == 1 df = df[mask]

为了实现在州列中合并NJ 和 NY( 即新泽西州和纽约州)到NY(纽约州)

[df.State =='NJ']- 查找State列中等于NJ的所有记录。

df.State [df.State =='NJ'] ='NY'- 对于State列中等于NJ的所有记录,将它们替换为NY。

# 将NJ变为 NY

mask = df.State == 'NJ' df['State'][mask] = 'NY'

现在我们有一个更清晰的数据集可以使用。

df['State'].unique()

# array(['FL', 'GA', 'NY', 'TX'], dtype=object)

此时,我们可能希望绘制数据图形以检查数据中是否存在任何异常值或不一致性。我们将使用dataframe 的plot()属性。

从下图中可以看出,数据质量不是特别的让人满意,表明需要进行更多的数据准备。

df['CustomerCount'].plot(figsize=(15,5));

如果看一下数据,就会开始意识到同一个State,StatusDate和Status组合有多个值。这可能意味着正在使用的数据是脏/坏/不准确,但我们将采取其他方式。可以假设此数据集是更大数据集的子集,如果对每个州,StatusDate和Status的CustomerCount相加,我们将获得每天的总客户数。

sortdf = df[df['State']=='NY'].sort_index(axis=0) sortdf.head(10)

运行结果如下:

State Status CustomerCount StatusDate 2009-01-12 NY 1 794 2009-02-02 NY 1 826 2009-02-16 NY 1 601 2009-04-13 NY 1 69 2009-04-20 NY 1 45 2009-05-04 NY 1 403 2009-05-11 NY 1 103 2009-06-15 NY 1 218 2009-07-13 NY 1 990 2009-07-20 NY 1 926

现在的任务是创建一个新的dataframe,以便我们每个State和StatusDate都有每日客户数。可以忽略Status列,因为此列中的所有值都是1。为此,我们将使用dataframe的函数groupby和sum()。

请注意,我们必须使用reset_index。如果不这样做,将无法通过State和StatusDate进行分组,因为groupby函数只需要列作为输入。该reset_index功能将使StatusDate返回到dataframe中一列。

#由State and StatusDate聚合操作 Daily = df.reset_index().groupby(['State','StatusDate']).sum() Daily.head()

运行结果如下:

Status CustomerCount State StatusDate FL 2009-01-19 1 495 2009-01-26 2 740 2009-02-09 1 128 2009-02-23 1 560 2009-03-02 1 28

State和StatusDate列自动放置在名为Daily 的dataframe。可以将索引视为数据库表的主键,但没有具有唯一值的约束。接着将看到索引中的列允许被任意地选择,绘制和执行数据。

下面删除Status列,因为它全部等于1,不再需要。

del Daily['Status'] Daily.head()

运行结果如下:

CustomerCount State StatusDate FL 2009-01-19 495 2009-01-26 740 2009-02-09 128 2009-02-23 560 2009-03-02 28

接着看一下详细信息

# dataframe 的index #Daily.index # status的index Daily.index.levels[0] # StatusDate 的index Daily.index.levels[1]

运行结果如下:

Index(['FL', 'GA', 'NY', 'TX'], dtype='object', name='State') DatetimeIndex(['2009-01-05', '2009-01-12', '2009-01-19', '2009-01-26', '2009-02-02', '2009-02-09', '2009-02-16', '2009-02-23', '2009-03-02', '2009-03-16', ... '2012-10-01', '2012-10-15', '2012-10-22', '2012-10-29', '2012-11-05', '2012-11-12', '2012-11-19', '2012-12-03', '2012-12-10', '2012-12-24'], dtype='datetime64[ns]', name='StatusDate', length=164, freq=None)

现在让我们绘制每个州的数据。

正如可以通过State列绘制图表所看到的那样,我们可以更清楚地了解数据。你能发现任何异常值吗?

Daily.loc['FL'].plot()

Daily.loc['GA'].plot() Daily.loc['NY'].plot() Daily.loc['TX'].plot();

FL

GA

NY

TX

预知后事如何,且听下次讲解

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-09-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小草学Python和SQL 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档