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

本文分享了关于2024年Python学习资料的获取途径,包括从零基础到进阶课程,以及如何使用Pandas进行数据处理,如百分比转换、合并DataFrame、数据透视、排序、绘图和编码名目数据。文章还强调了数据预处理和知识体系的重要性。
摘要由CSDN通过智能技术生成

收集整理了一份《2024年最新Python全套学习资料》免费送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img



既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Python知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来

如果你需要这些资料,可以添加V无偿获取:hxbc188 (备注666)
img

正文

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函数进行组合
  colBin = pd.cut(col,bins=break_points,labels=labels,include_lowest=True)
  return colBin

#组合:
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)

编码名目数据

通常我们会遇到一种情况,也就是必须修改名义变量的类别。这可能是因为多个原因:

一些算法(比如逻辑回归)需要所有输入为数值型。因而名义变量大部分编写为0,1···(n-1)。

有时一个类别可以表示为两种方式。例如,温度可以记录为“High”“Medium”和“Low”,或“H”“low”,这里的“High”和“H”都表示同一类别。同样地,“Low”和“low”也只是有略微区别而已。但是,Python会把它们读取为不同的等级。

有些类别出现的类别可能会很低,所以将它们合并通常是个好主意。这里我们定义一个通用函数,它的输入为字典形式,然后会用 Pandas 中的‘replace’函数将输入值编码。

#用Pandas的replace函数定义一个通用函数
def coding(col, codeDict):
  colCoded = pd.Series(col, copy=True)
  for key, value in codeDict.items():
    colCoded.replace(key, value, inplace=True)
  return colCoded
 
#将LoanStatus 编码为 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 '\nAfter Coding:'
print pd.value_counts(data["Loan_Status_Coded"])

迭代DadaFrame的行

这项技巧并不经常用到,但万一遇到此类难题时就不怕了,对吧?有些情况下,你可能会用一个 for 循环迭代所有的行。例如,我们面临的一个常见问题就是没有正确对待 Python 中的变量。通常出现在下面两种情况中:

  • 有数字类别的名义变量被当成数值变量
  • 当某一行带有字符(因为数据错误)的数值变量被当成分类变量

所以,手动定义列的类型往往是个更好的办法。如果我们检查所有列的数据类型:

#检查当前类型:
data.dtypes

这里我们可以看到 Credit_History 是一个名义变量,但却出现为浮点值。解决该问题的一个好方法就是创建一个 CSV 文件,带有列名和类型。通过这种方法,我们可以写一个通用函数来读取该文件,并分配列数据类型。例如,这里我们创建了一个 CSV 文件 datatypes.csv。

#加载文件:
colTypes = pd.read_csv('datatypes.csv')
print colTypes

在这里插入图片描述

感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的:

① 2000多本Python电子书(主流和经典的书籍应该都有了)

② Python标准库资料(最全中文版)

③ 项目源码(四五十个有趣且经典的练手项目及源码)

④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)

⑤ Python学习路线图(告别不入流的学习)

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

如果你需要这些资料,可以添加V无偿获取:hxbc188 (备注666)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
hon基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)

⑤ Python学习路线图(告别不入流的学习)

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

如果你需要这些资料,可以添加V无偿获取:hxbc188 (备注666)
[外链图片转存中…(img-Z0vg3jhh-1713859864571)]

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值