12个用于Python数据操作的Pandas技巧(附代码)_python pandas 操作(1)

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

https://datahack.analyticsvidhya.com/contest/practice-problem-loan-prediction-iii/

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

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

布尔索引

如果你想根据一定条件从一组列中筛选出一列的值,该怎么办?比如,我们想要一列,包含所有办了贷款且尚未毕业的女性名单。这里使用布尔索引就能帮上忙。可以使用如下代码:

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

Apply函数

Apply 函数是用于处理数据和创建新变量的常用函数之一。对 DataFrame 的某行/列应用函数之后,Apply 返回一些值。函数既可以使用默认的,也可以自定义。比如,这里就可以用它来寻找每行和每列的缺失值。

#创建一个新函数
def num_missing(x):
  return sum(x.isnull())

#应用每一列
print "Missing values per column:"
print data.apply(num_missing, axis=0) #axis=0 defines that function is to be applied on each column

#应用每一行
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

这样我们就得到了理想结果。

注意:在第二个输出中应用 head() 函数,因为它包含了很多行。

替换缺失值

使用 fillna() 即可一步实现替换缺失值。它可以用目标列的平均值/众数/中位数更新缺失值。在下面的例子中,我们用‘Gender’,‘Married’和‘Self_Employed’这几列的众数替换它们的缺失值。

#首先我们导入一个函数来确定模式
from scipy.stats import mode
mode(data['Gender'])

输出:

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

记住,众数有时也会是数组,因为可能会出现多个高频值。默认情况下我们用第一个:

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

输出:

‘Male’

现在我们就可以填充缺失值了,使用前面第 2 种方法进行检查。

#导入值:
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)

#现在再次检查缺失值进行确认:
print data.apply(num_missing, axis=0)

经确认,缺失值已经被替换掉。注意,这只是一种常见的替换方法,还有其它复杂的方法,比如为缺失值建模。

数据透视表

Pandas 还可以用于创建 Excel 风格的数据透视表。例如,在我们这个例子中,数据的关键列就是包含了缺失值的‘LoanAmount’。我们可以用‘Gender’,‘Married’和‘Self_Employed’这几个组的平均值替换掉缺失值。这样每组的平均‘LoanAmount’可以确定为:

#确定数据透视表
impute_grps = data.pivot_table(values=["LoanAmount"], index=["Gender","Married","Self_Employed"], aggfunc=np.mean)
print impute_grps

多索引

如果你留意一下第 3 种技巧的输出结果,你会发现它有一个奇怪的特点:每个索引由 3 个值组成。这就是多索引,它能加快我们的操作速度。

继续使用上面第 3 种技巧的例子,我们有每一组的值,但尚未估算缺失值。

我们可以使用之前用到的技巧来解决这个问题:

#用缺失的 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]

#现在再次检查缺失值进行确认
print data.apply(num_missing, axis=0)

注意:

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

这里的 .values[0] 后缀是必需的,因为默认情况下会返回一系列的元素,这会产生一个和 DataFrame 不匹配的索引。在这个例子中,直接分配值会产生错误。

Crosstab

该函数用于对数据获取一个初步的“感觉”(概览)。这里,我们可以验证一个基本的假设。例如,在这个例子中,我们预计“Credit_History”会大幅影响借款状态。那么我们就可以用如下所示的交叉表进行测试:

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

这些都是绝对值。但是,使用百分比会更直观些。我们可以用 apply 函数来完成:

def percConvert(ser):
  return ser/float(ser[-1])
  pd.crosstab(data["Credit_History"],data["Loan_Status"],margins=True).apply(percConvert, axis=1)

现在,很明显有信用历史的人获取贷款的几率更高:达到 80%,而没有信用的人只有 9%。

但事实并非如此简单。由于我们已知具有信用历史非常重要,那么如果我们将有信用历史的人的借款状态预测为 Y、无信用历史的人预测为 N,会怎样呢?我们会惊讶地发现,全部 614 次测试中有 82+378=460 次预测正确,准确率达到了 75%!

你可能会纳闷为何我们需要统计模型,但是你要知道,能将准确率提高哪怕 0.001% 也是一项非常艰难的挑战。

注意:75% 的准确率是在训练集上取得的准确率,在测试集上会略微不同,但也差不多。

合并DataFrame

如果我们有来自多个数据源的信息需要核对,那么合并 DataFrame 会是基本的操作。考虑一种假设情况,其中不同房产类型有不同的房产均价(每平米价格),我们将 DataFrame 定义为:

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

现在,我们就可以将该信息和初始 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)

通过数据透视表我们可以知道成功合并了。注意,‘values’参数和这里无关,因为我们只是简单计算值而已。

为DataFrame排序

Pandas 能让我们很容易地根据多个列进行排序,可以通过如下操作完成:

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

注意:Pandas 的“Sort”函数已经不能用了,我们应该使用“sort_values”来代替它。

绘图(箱形图&直方图)

可能有很多人不知道我们可以在 Pandas 上直接绘出箱型图和直方图,其实没必要额外调用 matplotlib。只需一行命令就行了。例如,如果我们想根据 Loan_Status 比较贷款申请人的收入分布情况:

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

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

从图表中可以看到,收入并不是一个很大的决定性因素,因为收到贷款的人和贷款被拒的人的收入之间并没有明显的差别。

将cut函数用于数据组合

有时经过聚类处理后,数值会更有意义。例如,我们想为一天内的车流量建模(时间单位为分钟),精确到每小时每分钟对于预测车流量来说,可能相关度并不是那么高,使用一天中的实际时间段比如“早晨”“下午”“傍晚”“夜晚”“深夜”效果会更好。通过这种方式为车流量建模,会更直观,也能避免过拟合。

这里我们定义一个简单的函数,可以重新用于组合任何变量:

#组合:
def binning(col, cut_points, labels=None):
  #定义最小和最大值
  minval = col.min()
  maxval = col.max()

  #向cut_points添加最大和最小值来创建列表
  break_points = [minval] + cut_points + [maxval]

  #如果没提供标签就用默认标签 0 ... (n-1)
  if not labels:
    labels = range(len(cut_points)+1)

  #用Pandas的cut函数进行组合


### 最后

不知道你们用的什么环境,我一般都是用的Python3.6环境和pycharm解释器,没有软件,或者没有资料,没人解答问题,都可以免费领取(包括今天的代码),过几天我还会做个视频教程出来,有需要也可以领取~  

给大家准备的学习资料包括但不限于:  

Python 环境、pycharm编辑器/永久激活/翻译插件  

python 零基础视频教程  

Python 界面开发实战教程  

Python 爬虫实战教程  

Python 数据分析实战教程  

python 游戏开发实战教程  

Python 电子书100本  

Python 学习路线规划

![](https://img-blog.csdnimg.cn/d29631674929476f9c3b30f7ff58dff0.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZlaTM0Nzc5NTc5MA==,size_16,color_FFFFFF,t_70)




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618317507)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**



![](https://img-blog.csdnimg.cn/d29631674929476f9c3b30f7ff58dff0.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZlaTM0Nzc5NTc5MA==,size_16,color_FFFFFF,t_70)




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618317507)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 26
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值