{DAY 19} Pandas 学习笔记part.5

前言

这篇文章会进行到更多的资料操作

将会分成两个部分:

  1. DataFrame Loading
  2. 用条件选择出资料

首先在一大笔资料未必每个资料都会使用到

所以如何透过条件筛选出符合特定条件的资料

是进行资料分析最基本的操作

因为筛选资料的语法会根据使用情境的不同而有各式各样的对应语法

在这篇文章会使用到最基本的布林值操作还有比较运算元

使用上如果需要更多的应用可以去stakeoverflow上找

因为比起用堆叠布林运算元跟比较运算元

pandas身为专门用来资料处理的工具

可能会有更为简便的操作语法

会继续利用kaggle上的开源资料进行更多的pandas练习

Kaggle: Your Machine Learning and Data Science Community

看的课程还是Coursera上的 Introduction to Data Science in Python

Coursera | Online Courses & Credentials From Top Educators. Join for Free | Coursera

练习是利用上述课程里教的搭配以前在学校学过的知识

整里并且搭配实际的资料档

整理出来的笔记

DataFrame Loading

大多数的时候当我们想要进行资料分析

会需要连结到外部的资料库

而外部资料的档案多使用的形式为.csv档

csv档为常见的资料储存格式

每个资料之间利用逗号隔开

在使用python时

处理这种资料会需要蛮繁复的手续

读进来後要先处理逗号

并且处理栏跟列的名称

但是在pandas套件里有强大的dataframe处理功能

可以用简单的pd.read_csv( )

直接将csv档读取并且排列成易读性高dataframe

让资料的分析更为快速简便

现在利用kaggle上电信公司的顾客资讯来实际练习

将外部的csv档读进来进行

进行接续更多的资料操作练习

这里使用的是"Telo Customer Churn"的档案

是一笔有关电信公司的顾客资料

Telco Customer Churn

首先先将csv档案读进来

利用pd.read_csv( )

import pandas as pd
df = pd.read_csv("WA_Fn-UseC_-Telco-Customer-Churn.csv")
df.head()

这是输出的部分截图

可以看到row的index是default的从0开始的数据

若是我们想要将index设为customerID

可以再把档案读进来的时候,增加一个index=" " 的参数

df = pd.read_csv("WA_Fn-UseC_-Telco-Customer-Churn.csv", index_col = 0)
df.head()

可以看到index换成了ciustomerID

很多时候会需要更改column的名称

让资料的易读性提高

若是我们想要让column的名称全部都用小写表示

# 首先先让column的名称变成list
cols = list(df.columns)
# 接下来让他们全部变成小写lower(),为了避免空格的问题,可以使用strip()
cols = [x.lower().strip() for x in cols]
# 复制一个资料表
copy_df = df.copy()
# 让新的list取代原本的栏位名称
copy_df.columns = cols
copy_df.head()

可以看到column的名称全部变成小写

用条件选择出资料

资料是延续上篇文章使用到的

用的是"Telo Customer Churn"的档案

一笔有关电信公司的顾客资料

Telco Customer Churn

先来回顾一下这笔资料长怎样

df.head()

在上篇学会了基本的资料查询语法

这里要学着用布林遮罩来选取符合特定条件的资料

假如现在想找出顾客里是女生的资料

female = df["gender"] == "Female"
female
'''
customerID
7590-VHVEG     True
5575-GNVDE    False
3668-QPYBK    False
7795-CFOCW    False
9237-HQITU     True
              ...  
6840-RESVB    False
2234-XADUH     True
4801-JZAZL     True
8361-LTMKD    False
3186-AJIEK    False
Name: gender, Length: 7043, dtype: bool
'''

可以看到回传的资料会用True,False的布林值表示

若是想要在回传的资料表里隐藏False的数值,可以使用.where()

df.where(female).head()

可以看到有False的栏位(所有性别是Male的)都变成NaN

若是想要只输出留下Yes的资料,可以用到.dropna( )

df.where(female).dropna().head()

可以从gender栏位看到剩下的都是Female的资料

在pandas里有更为简便的手法取出符合特定条件的资料,可以使用[indexing operator]即可

df[df["gender"]=="Female"].head()

可以很简洁地得到性别为女生的资料

当我们想找MonthlyCharges介於50到100有哪些人

  1. 可以利用比较元进行运算

    先产生出一个由布林值构成的 series

    filter = (df["MonthlyCharges"] > 50) & (df["MonthlyCharges"]<100) # 记得要用括号
    filter
    '''
    customerID
    7590-VHVEG    False
    5575-GNVDE     True
    3668-QPYBK     True
    7795-CFOCW    False
    9237-HQITU     True
                  ...  
    6840-RESVB     True
    2234-XADUH    False
    4801-JZAZL    False
    8361-LTMKD     True
    3186-AJIEK    False
    Name: MonthlyCharges, Length: 7043, dtype: bool
    '''
    
  2. 使用 built-in function的方法

    .gt() 表示greater than
    .lt() 表示lower than

    df["MonthlyCharges"].gt(50) & df["MonthlyCharges"].lt(100)
    '''
    customerID
    7590-VHVEG    False
    5575-GNVDE     True
    3668-QPYBK     True
    7795-CFOCW    False
    9237-HQITU     True
                  ...  
    6840-RESVB     True
    2234-XADUH    False
    4801-JZAZL    False
    8361-LTMKD     True
    3186-AJIEK    False
    Name: MonthlyCharges, Length: 7043, dtype: bool
    '''
    

    由於这是built-in在Series和DataFrame的,所以可以利用chain连接一起使用

    df["MonthlyCharges"].gt(50).lt(100)
    '''
    customerID
    7590-VHVEG    False
    5575-GNVDE     True
    3668-QPYBK     True
    7795-CFOCW    False
    9237-HQITU     True
                  ...  
    6840-RESVB     True
    2234-XADUH    False
    4801-JZAZL    False
    8361-LTMKD     True
    3186-AJIEK    False
    Name: MonthlyCharges, Length: 7043, dtype: bool
    '''
    

    小结

这篇文章练习到如何筛选资料

可以看到搭配实际资料档案应用後的效果

在筛选资料时要注意到括号的使用

像是(df["MonthlyCharges"] > 50) & (df["MonthlyCharges"]<100)

如果两个条件没有用括号匡起来

变成这样df["MonthlyCharges"] > 50 & df["MonthlyCharges"]<100

会无法成功运作kernel而跑不出想要的答案

也要记得同样的处理方式

若是有更简便的语法可以使用

可以针对易读性下去判断是否要使用


<<:  端点防护软件 - 弱点通报机制 VANS

>>:  [Day 17] v-model双向绑定是什麽咧??

Day 17 - 利用程序码制造出韵律,随机性 - angleMode / random / noise

了解旋转、圆形与极座标的概念 如何利用弦波函数产生韵律感 利用噪声产生连续的乱数 如何使用噪声产生...

[机派X] Day 11 - 让我们拆了这台无人机

引言 今天是机派X系列文章的第十一天。 昨天很寒酸的简介无人机,今天会从单一零件的角度一一将无人机的...

Unity与Photon的新手相遇旅途 | Day11-敌人攻击

今天的内容为该如何简单制作出一个自动攻击的敌人 ...

Web基础篇

先宣传一下我的新书,终於出来惹,感动到无法言语>"< 还请大家多多支持! We...

Day05 媒体协商与SDP

媒体协商 上一篇提到,要进行 WebRTC的连线需要处理以下两个问题,今天我们就来看看媒体协商的部分...