首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

本节主要内容为识别异常值及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

准备数据

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

确保state列全部为大写

仅选择帐户状态等于“1”的记录

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

删除任何异常值(数据集中的任何奇怪结果)

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

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

运行结果如下:

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

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

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180909G01H5000?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券