0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

12种用于数据分析的Pandas技巧可用来学习Python详细概述

zhKF_jqr_AI 来源:未知 作者:易水寒 2018-05-19 11:40 次阅读

编者按:依靠完善的编程语言生态系统和更好的科学计算库,如今Python几乎已经成了数据科学家的首选语言。如果你正开始学习Python,而且目标是数据分析,相信NumPy、SciPy、Pandas会是你进阶路上的必备法宝。尤其是对数学专业的人来说,Pandas可以作为一个首选的数据分析切入点。

本文将介绍12种用于数据分析的Pandas技巧,为了更好地描述它们的效果,这里我们用一个数据集辅助进行操作。

数据集:我们研究的主题是贷款预测,请到datahack.analyticsvidhya.com/contest/practice-problem-loan-prediction下载数据(需注册),并开始学习之旅。

预备!开始!

首先,我们先导入模块,并将数据集加载到Python环境中:

import pandas as pd

import numpy as np

data = pd.read_csv("train.csv", index_col="Loan_ID")

1. Boolean Indexing

在表格中,如果你想根据另一列的条件筛选当前列的值,你会怎么做?举个例子,假设我们想要一份所有未毕业但已经办理了贷款的女性清单,具体的操作是什么?在这种情况下,Boolean Indexing,也就是布尔索引能提供相应的功能。我们只需这样做:

data.loc[(data["Gender"]=="Female") & (data["Education"]=="Not Graduate") & (data["Loan_Status"]=="Y"), ["Gender","Education","Loan_Status"]]

12种用于数据分析的Pandas技巧可用来学习Python详细概述

2. Apply Function

Apply函数是使用数据和创建新变量的常用函数之一。在对DataFrame的特定行/列应用一些函数后,它会返回相应的值。这些函数既可以是默认的,也可以是用户自定义的。如这里我们就定义了一个查找每行/列中缺失值的函数:

#Create a new function:

def num_missing(x):

return sum(x.isnull())

#Applying per column:

print"Missing values per column:"

print data.apply(num_missing, axis=0) #axis=0 defines that function is to be applied on each column

#Applying per row:

print" Missing values per row:"

print data.apply(num_missing, axis=1).head() #axis=1 defines that function is to be applied on each row

12种用于数据分析的Pandas技巧可用来学习Python详细概述

我们得到了预期的结果。需要注意的一点是,这里head() 函数只作用于第二个输出,因为它包含多行数据。

3. 替换缺失值

对于替换缺失值,fillna()可以一步到位。它会用目标列的平均值/众数/中位数更新缺失值,以此达到目的。在这个示例中,让我们用众数分别更新Gender、Married、Self_Employed这几列的缺失值:

#First we import a function to determine the mode

from scipy.stats import mode

mode(data['Gender'])

输出:

ModeResult(mode=array([‘Male’], dtype=object), count=array([489]))

我们得到了众数及其出现的次数。记住很多时候众数会是一个数组,因为可能数据中存在多个高频词,默认情况下,我们会选择第一个:

mode(data['Gender']).mode[0]

*‘Male’

现在我们就能更新缺失值,并检测自己对Apply函数的掌握情况:

#Impute the values:

data['Gender'].fillna(mode(data['Gender']).mode[0], inplace=True)

data['Married'].fillna(mode(data['Married']).mode[0], inplace=True)

data['Self_Employed'].fillna(mode(data['Self_Employed']).mode[0], inplace=True)

#Now check the #missing values again to confirm:

print data.apply(num_missing, axis=0)

12种用于数据分析的Pandas技巧可用来学习Python详细概述

从结果上看,缺失值的确被补上了,但这只是最原始的形式,在现实工作中,我们还要掌握更复杂的方法,如分组使用平均值/众数/中位数、对缺失值进行建模等。

4. Pivot Table

Pandas可以用来创建MS Excel样式数据透视表(Pivot Table)。在本文的例子中,数据的关键列是含有缺失值的“LoanAmount”。为了获得具体的贷款额度数字,我们可以用Gender、Married、Self_Employed这几列的贷款情况进行估算:

#Determine pivot table

impute_grps = data.pivot_table(values=["LoanAmount"], index=["Gender","Married","Self_Employed"], aggfunc=np.mean)

print impute_grps

12种用于数据分析的Pandas技巧可用来学习Python详细概述

5. Multi-Indexing

如果你仔细观察了“替换缺失值”那一节的输出,你可能会发现一个奇怪的现象,就是每个索引都由3个值组合而成。这被称为多重索引(Multi-Indexing),它有助于操作的快速执行。

让我们接着这个例子,假设现在我们有各列的值,但还没有进行缺失值估算。这时就要用到之前的各种技巧:

#iterate only through rows with missing LoanAmount

for i,row in data.loc[data['LoanAmount'].isnull(),:].iterrows():

ind = tuple([row['Gender'],row['Married'],row['Self_Employed']])

data.loc[i,'LoanAmount'] = impute_grps.loc[ind].values[0]

#Now check the #missing values again to confirm:

print data.apply(num_missing, axis=0)

12种用于数据分析的Pandas技巧可用来学习Python详细概述

注:

多索引需要元组来定义loc语句中的索引组。这是一个在函数中要用到的元组。

values [0]的后缀是必需的,因为默认情况下返回的值与DataFrame的值不匹配。在这种情况下,直接分配会出现错误。

6. Crosstab

这个函数可以被用来塑造对数据的初始“感觉(概览)”,通俗地讲,就是我们可以验证一些基本假设,如在贷款案例中,“Credit_History”会影响个人贷款成功与否。这可以用交叉表(Crosstab)测试,如下所示:

pd.crosstab(data["Credit_History"],data["Loan_Status"],margins=True)

12种用于数据分析的Pandas技巧可用来学习Python详细概述

如果说数值还不够直观,我们可以用apply函数把它转换成百分比:

def percConvert(ser):

return ser/float(ser[-1])

pd.crosstab(data["Credit_History"],data["Loan_Status"],margins=True).apply(percConvert, axis=1)

12种用于数据分析的Pandas技巧可用来学习Python详细概述

显然,有“CreditHistory”的人获得贷款的机会更大,有80%以上的概率,而没有“CreditHistory”的人获得贷款的概率只有可怜的9%。

但是这就是个简单的预测结果吗?不是的,这里包含着一个有趣的故事。已知有CreditHistory”的人获得贷款的概率更高,那我们大可以设他们的“LoanStatus”为Y,其他人的为N,这样一个模型的预测结果会是什么样的?我们进行了614次测试,而它的正确预测次数是82+378=460,75%的准确率!

也许你会吐槽这么个问题为什么要扯到统计模型。我不否认,但我只想说明一点,就是如果你能把这个模型的准确率再提升哪怕0.001%,这都是个巨大的突破。

注:这里的75%是个大概的值,具体数字在训练集和测试集上有所不同。我希望这能直观地解释为什么在Kaggle这样的比赛中,0.05%的准确率提升能带来500名以上的排名提升。

7. 合并DataFrame

当我们需要将来自不同来源的信息进行整合时,合并DataFrame(或者你们爱说数据框)就变得很重要了。现在房价很热,炒房团也很热,所以我们先用数据集的数据假设一份各地区房屋均价(1平)不同的表:

prop_rates = pd.DataFrame([1000,5000,12000],index = ['Rural','Semiurban','Urban'],columns = ['rates'])

prop_rates

12种用于数据分析的Pandas技巧可用来学习Python详细概述

现在我们可以将这些信息与原始DataFrame合并为:

data_merged = data.merge(right=prop_rates, how='inner',left_on='Property_Area',right_index=True, sort=False)

data_merged.pivot_table(values='Credit_History',index=['Property_Area','rates'], aggfunc=len)

12种用于数据分析的Pandas技巧可用来学习Python详细概述

反正买不起,好了,数据合并成功了。请注意,'values'参数在这里是没什么用的,因为我们只是做计数。

8. DataFrame排序

Pandas可以轻松基于多列进行排序,如下所示

data_sorted = data.sort_values(['ApplicantIncome','CoapplicantIncome'], ascending=False)

data_sorted[['ApplicantIncome','CoapplicantIncome']].head(10)

12种用于数据分析的Pandas技巧可用来学习Python详细概述

注:Pandas的sort函数已经不能用了,现在排序要调用sort_value。

9. 绘图(Boxplot和直方图)

很多人可能不知道自己能直接在Pandas里绘制盒形图和直方图,无需单独调用matplotlib,一行命令就能搞定。例如,如果我们想比较Loan_Status的ApplicantIncome的分布情况:

import matplotlib.pyplot as plt

%matplotlib inline

data.boxplot(column="ApplicantIncome",by="Loan_Status")

12种用于数据分析的Pandas技巧可用来学习Python详细概述

data.hist(column="ApplicantIncome",by="Loan_Status",bins=30)

12种用于数据分析的Pandas技巧可用来学习Python详细概述

这两幅图表明收入在贷款过程中所占的比重并没有我们想象中那么高,无论是被拒的还是收到贷款的,他们的收入没有非常明显的区别。

10. Cut function for binning

有时候聚类后的数据会更有意义。以今天最近车祸频发的自动驾驶汽车为例,如果我们要用它捕获的数据重现某条路上的交通情况,比起一整天的流畅数据,或是把一天均匀分割为24个小时,“早上”“下午”“晚上”“夜晚”“深夜”这几个关键时段的数据包含的信息量更多,也更有效。如果我们用这些数据建模,它的成果会更直观,而且可以避免过拟合。

这里我们定义一个简单的函数,它可以高效binning:

#Binning:

def binning(col, cut_points, labels=None):

#Define min and max values:

minval = col.min()

maxval = col.max()

#create list by adding min and max to cut_points

break_points = [minval] + cut_points + [maxval]

#if no labels provided, use default labels 0 ... (n-1)

ifnot labels:

labels = range(len(cut_points)+1)

#Binning using cut function of pandas

colBin = pd.cut(col,bins=break_points,labels=labels,include_lowest=True)

return colBin

#Binning age:

cut_points = [90,140,190]

labels = ["low","medium","high","very high"]

data["LoanAmount_Bin"] = binning(data["LoanAmount"], cut_points, labels)

print pd.value_counts(data["LoanAmount_Bin"], sort=False)

12种用于数据分析的Pandas技巧可用来学习Python详细概述

11. 为nominal数据编码

有时候我们需要对称名数据(nominal数据)重新分类,这可能是由于各种原因造成的:

一些算法(如Logistic回归)要求所有输入都是数字,所以我们要把称名变量重新编码为0,1 ...(n-1)。

有时一个类别可能包含多种表达,如“温度”可以被记录为“High”“Medium”“Low”“H”“low”,其中“High”和“H”是一码事,“Low”和“low”也是一码事,但Python会认为它们是不同的。

有些类别的频数非常低,所以我们应该把它们合并起来。

为了解决这个问题,这里我们定义了一个简单的函数,它把输入作为“字典”,然后调用Pandas的replace函数重新编码:

#Define a generic function using Pandas replace function

def coding(col, codeDict):

colCoded = pd.Series(col, copy=True)

for key, value in codeDict.items():

colCoded.replace(key, value, inplace=True)

return colCoded

#Coding LoanStatus as Y=1, N=0:

print'Before Coding:'

print pd.value_counts(data["Loan_Status"])

data["Loan_Status_Coded"] = coding(data["Loan_Status"], {'N':0,'Y':1})

print' After Coding:'

print pd.value_counts(data["Loan_Status_Coded"])

12种用于数据分析的Pandas技巧可用来学习Python详细概述

12. 迭代dataframe的行

这不是一个常用的技巧,但如果遇到这种问题,相信没人想到时候再绞尽脑汁想办法,或者直接自暴自弃用for循环遍历所有行。这里我们举两个要用到这种方法的场景:

当带有数字的nominal variable被当成数字。

当某一行带有字符(因为数据错误)的Numeric variable被当成分类。

这时我们就要手动定义列的类别。虽然很麻烦,但这之后如果我们再检查数据类别:

#Check current type:

data.dtypes

它的输出会是:

12种用于数据分析的Pandas技巧可用来学习Python详细概述

这里我们看到Credit_History是一个称名变量,但是它却显示为float。解决这些问题的一个好方法是创建一个包含列名和类型的csv文件,有了它,我们就可以创建一个函数来读取文件并分配列数据类型。

#Load the file:

colTypes = pd.read_csv('datatypes.csv')

print colTypes

12种用于数据分析的Pandas技巧可用来学习Python详细概述

加载这个文件后,我们可以遍历每一行,并使用'type'列将数据类型赋值给'feature'列中定义的变量名称。

#Iterate through each row and assign variable type.

#Note: astype is used to assign types

for i, row in colTypes.iterrows(): #i: dataframe index; row: each row in series format

if row['type']=="categorical":

data[row['feature']]=data[row['feature']].astype(np.object)

elif row['type']=="continuous":

data[row['feature']]=data[row['feature']].astype(np.float)

print data.dtypes

12种用于数据分析的Pandas技巧可用来学习Python详细概述

希望本文对你有用!

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4299

    浏览量

    62374
  • 数据分析
    +关注

    关注

    2

    文章

    1423

    浏览量

    33998
  • python
    +关注

    关注

    55

    文章

    4777

    浏览量

    84415

原文标题:12种用于Python数据分析的Pandas技巧

文章出处:【微信号:jqr_AI,微信公众号:论智】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    python数据分析的类库

    学运算及对数组执行元素级计算的函数;3).用于读写硬盘上基于数组的数据集的工具;4).线性代数运算、傅里叶变换,以及随机数生成。2.Pandas大名鼎鼎的Pandas可以说只要做
    发表于 05-10 15:18

    怎么有效学习Python数据分析

    Python在人工智能、机器学习领域受到火热追捧,很大程度上在于它拥有非常庞大的第三方库,以及强大的通用编程性能。因此,快速掌握Python进行数据分析,就是
    发表于 06-28 15:18

    pandas数据分析的方法

    pandas数据分析中常用方法
    发表于 06-03 06:16

    pandas数据分析常见操作

    数据分析-pandas数据处理清洗常用总结
    发表于 08-08 06:46

    pandas对babynames数据集的简单处理

    利用Python进行数据分析——第二章 引言(2):利用pandas对babynames数据集进行简单处理
    发表于 08-09 12:58

    python 数据分析基础 day12-python调用mysql

    python 数据分析基础 day12-python调用mysql
    发表于 10-23 13:34

    基于Python数据分析

    《利用Python进行数据分析》 113日期范围、频率和移位
    发表于 05-01 11:24

    成为Python数据分析师,需要掌握哪些技能

    数据驱动问题解决第四、数据分析师要求的三大能力统计学基础和分析工具应用计算机编码能力特定应用领域或行业的知识第五数据分析数据分析很重要的学科
    发表于 06-23 12:16

    成为Python数据分析师,需要掌握哪些技能

    数据驱动问题解决第四、数据分析师要求的三大能力统计学基础和分析工具应用计算机编码能力特定应用领域或行业的知识第五数据分析数据分析很重要的学科
    发表于 06-30 11:42

    pandas是什么?

    人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、
    发表于 01-12 07:53

    机器学习开发课程,使用Pandas探索数据分析

    Pandas是一个Python库,提供了大量数据分析的方法。数据科学家经常和表格形式的数据(比如.csv、.tsv、.xlsx)打交道。
    的头像 发表于 03-14 18:07 4793次阅读

    解读12 Numpy 和 Pandas 高效函数技巧

    本文分享给大家 12 Numpy 和 Pandas 函数,这些高效的函数会令数据分析更为容易、便捷。最后,读者也可以在 GitHub 项目中找到本文所用代码的 Jupyter No
    的头像 发表于 06-29 17:05 1471次阅读

    Python Pandas如何来管理结构化数据

    Python Pandas是一个为Python编程提供数据操作和分析功能的开源工具包。这个库已经成为数据
    的头像 发表于 05-25 11:22 655次阅读
    <b class='flag-5'>Python</b> <b class='flag-5'>Pandas</b>如何来管理结构化<b class='flag-5'>数据</b>

    python机器学习概述

    是一非常流行的编程语言,因为它具有非常强大的数据分析和科学计算库。Python可以被用来完成一系列的任务,包括机器学习
    的头像 发表于 08-17 16:11 1038次阅读

    PandasPython中最好的数据分析工具

    Pandas绝对是Python中最好的数据分析工具,不接受反驳。 本文将展示如何美化 Pandas DataFrame 中的数字,并使用一些更高级的
    的头像 发表于 10-31 10:47 448次阅读
    <b class='flag-5'>Pandas</b>:<b class='flag-5'>Python</b>中最好的<b class='flag-5'>数据分析</b>工具