Pandas的几个实用技巧

举报
Python爱好者 发表于 2020/12/30 01:09:42 2020/12/30
【摘要】 Python 正迅速成为数据科学家们更为钟爱的编程语言。形成该现状的理由非常充分:Python 提供了一种覆盖范围更为广阔的编程语言生态系统,以及具有一定计算深度且性能良好的科学计算库。 在 Python 自带的科学计算库中,Pandas 模块是最适于数据科学相关操作的工具。它与 Scikit-learn 两个模块几乎提供了数据科学家所需的全部工具。本文着重介...

640?wx_fmt=gif

Python 正迅速成为数据科学家们更为钟爱的编程语言。形成该现状的理由非常充分:Python 提供了一种覆盖范围更为广阔的编程语言生态系统,以及具有一定计算深度且性能良好的科学计算库。

在 Python 自带的科学计算库中,Pandas 模块是最适于数据科学相关操作的工具。它与 Scikit-learn 两个模块几乎提供了数据科学家所需的全部工具。本文着重介绍了 Python 中数据处理12 种方法。此前的文章里也分享了一些技巧和经验,这些将有助于您提高工作效率

首先导入相关模块并加载数据集到 Python 环境中:

import pandas as pd
import numpy as np
data = pd.read_csv("train.csv", index_col="Loan_ID")


#1 – Boolean Indexing(布尔索引)

如果需要以其它列数据值为条件过滤某一列的数据,您会怎么处理?例如建立一个列表,列表中全部为未能毕业但曾获得贷款的女性。这里可以使用布尔索引,代码如下:

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

640?wx_fmt=png



#2 – Apply Function(apply函数)

Apply 函数是处理数据和建立新变量的常用函数之一。在向数据框的每一行或每一列传递指定函数后,Apply 函数会返回相应的值。这个由 Apply 传入的函数可以是系统默认的或者用户自定义的。例如,在下面的例子中它可以用于查找每一行和每一列中的缺失值。

#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 "\nMissing values per row:" print data.apply(num_missing, axis=1).head()
#axis=1 defines that function is to be applied on each row


#3 – Imputing missing files(添加稀缺值)

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]))


#4 – Pivot Table(表透视)

Pandas 可建立 MS Excel 类型的数据透视表。例如在下文的代码段里,关键列“LoanAmount” 存在缺失值。我们可以根据“Gender”,“Married”和“Self_Employed”分组后的平均金额来替换。 “LoanAmount”的各组均值可由如下方法确定:

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

640?wx_fmt=png


#5 – 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]

640?wx_fmt=png

#Now check the #missing values again to confirm:
print data.apply(num_missing, axis=0)

注:

1. 多值索引需要在 loc 语句中使用用于定义索引分组的元组结构。该元组会在函数中使用。

2. 应使用后缀 .values[0] 以避免潜在的错误。因为默认情况下复合索引返回的 Series 元素索引顺序与所在的数据框架(dataframe)不一致。在此条件下直接赋值会产生错误。

#6. Crosstab

该函数用于获取数据的初始印象(直观视图),从而验证一些基本假设。例如在本例中,“Credit_History”被认为会显著影响贷款状态。这个假设可以通过如下代码生成的交叉表进行验证:

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

640?wx_fmt=png


#7 – Merge DataFrames(合并DF)

当有来自不同数据源的信息需要收集整理时,合并数据框就变成了一项必不可少的基本操作。考虑一个假设的情况,即不同类型的房产有不同的均价(单位:INR / 平方米)。定义数据框如下:

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

640?wx_fmt=png

现在可将上述信息与原始数据框合并如下:

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)

640?wx_fmt=png


#8 – Sorting DataFrames

Pandas 允许基于多列数据进行简单排列。具体实现如下:

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

640?wx_fmt=png



#9 – Plotting 画图

(Boxplot函数 & Histogram函数)

如果想通过 Loan_Status 比较 ApplicantIncome 的分布情况,则实现代码如下:

import matplotlib.pyplot as plt
%matplotlib inline
data.boxplot(column="ApplicantIncome",by="Loan_Status")

640?wx_fmt=png

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

640?wx_fmt=png

上图的数据结果表明,由于获得贷款人群和未获得贷款人群数没有明显的收入差距,因此个人收入水平高低并非是否能获得贷款的主要决定因素。


#10 – Cut function for binning

有时将数值数据聚合在一起会更有意义。例如,如果我们要根据一天中的某个时间段(单位:分钟)建立交通流量模型模型(以路上的汽车为统计目标)。与具体的分钟数相比,对于交通流量预测而言一天中的具体时间段则更为重要,如“早上”、 “下午”、“傍晚”、“夜晚”、“深夜(Late Night)”。以这种方式建立交通流量模型则更为直观且避免了过拟合情况的发生。

下面的例子中定义了一个简单的可重用函数,该函数可以非常轻松地实现任意变量的分箱功能。

#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)
  if not 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)

640?wx_fmt=png



今天就到这里吧!



听说有气质的人都会关注这个公众号!

640?wx_fmt=jpeg




文章来源: blog.csdn.net,作者:敲代码的灰太狼,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/tongtongjing1765/article/details/100581685

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。