公众号后台回复“图书“,了解更多号主新书内容
作者:朱小五
来源:凹凸数据
之前黄同学曾经总结过一些Pandas函数,主要是针对字符串进行一系列的操作。在此基础上我又扩展了几倍,全文较长,建议先收藏。
今天我们重新盘点66个Pandas函数合集,包括数据预览、数值数据操作、文本数据操作、行/列操作等等,涉及“数据清洗”的方方面面。
Pandas 是基于NumPy的一种工具,该工具是为解决数据分析任务而创建的。它提供了大量能使我们快速便捷地处理数据的函数和方法。
数据预览
对于探索性数据分析来说,做数据分析前需要先看一下数据的总体概况。info()
方法用来查看数据集信息,describe()
方法将返回描述性统计信息,这两个函数大家应该都很熟悉了。
describe方法默认只给出数值型变量的常用统计量,要想对DataFrame中的每个变量进行汇总统计,可以将其中的参数include设为all。
head()
方法和tail()
方法则是分别显示数据集的前n和后n行数据。如果想要随机看N行的数据,可以使用sample()
方法。
df.sample(3)
输出:
![f7e07f026812b5aa02135c16674ae8dc.png](https://i-blog.csdnimg.cn/blog_migrate/570b78b1525126e22548897c557045f9.png)
如果要检查数据中各列的数据类型,可以使用.dtypes
;如果想要值查看所有的列名,可以使用.columns
。
df.columns
输出:
Index(['日期', '销量'], dtype='object')
前面介绍的函数主要是读取数据集的数据信息,想要获得数据集的大小(长宽),可以使用.shape
方法。
df.shape
输出:
(5, 2)
另外,len()
可以查看某列的行数,count()
则可以查看该列值的有效个数,不包含无效值(Nan)。
缺失值与重复值
Pandas清洗数据时,判断缺失值一般采用isnull()
方法。此外,isnull().any()
会判断哪些”列”存在缺失值,isnull().sum()
用于将列中为空的个数统计出来。
df.isnull().any()
输出:
日期 False
销量 True
dtype: bool
发现“销量”这列存在缺失值后,处理办法要么删除dropna()
,要么填充fillna()
。
df.fillna(50)
输出:
![1c95f9309062f6e06af405611e81a783.png](https://i-blog.csdnimg.cn/blog_migrate/685d8a6eabfc354476e2f41647f585bf.png)
Pandas清洗数据时,判断重复值一般采用duplicated()
方法。如果想要直接删除重复值,可以使用drop_duplicates()
方法。此处较为常见,不再过多演示。
数值数据操作
我们在处理数据的时候,会遇到批量替换的情况,replace()
是很好的解决方法。它既支持替换全部或者某一行,也支持替换指定的某个或指定的多个数值(用字典的形式),还可以使用正则表达式替换。
df["编号"].replace(r'BA.$', value='NEW', regex=True, inplace = True)
输出:
![31371a6534e5745a539ea144ae83ec0b.png](https://i-blog.csdnimg.cn/blog_migrate/f5a7eb128da8a5a79d70e871791b6370.png)
在Pandas模块中, 调⽤rank()
⽅法可以实现数据排名。
df["排名"] = df.rank(method="dense").astype("int")
输出:
![a1381df1d873b0a0c45c6654e95abc2c.png](https://i-blog.csdnimg.cn/blog_migrate/65d0f17afbd79099c38f8c73f8092e17.png)
rank()
⽅法中的method参数,它有5个常⽤选项,可以帮助我们实现不同情况下的排名。
![35ff17a73e38db1cfce80f4470bca4ef.png](https://i-blog.csdnimg.cn/blog_migrate/f069d15bffaab2c783818388263c0c1e.png)
clip()
方法,用于对超过或者低于某些数的数值进行截断[1],来保证数值在一定范围。比如每月的迟到天数一定是在0-31天之间。
df["迟到天数"] = df["迟到天数"].clip(0,31)
![a3adc57048a989b1c0bdf9c098550526.png](https://i-blog.csdnimg.cn/blog_migrate/c1017709088bf49e5bf0bfe096460480.png)
唯一值,unique()
是以数组形式返回列的所有唯一值,而nunique()
返回的是唯一值的个数。
df["gender"].unique()
df["gender"].nunique()
输出:
![a6178bdfd0db515ef9e81b1e6adebd72.png](https://i-blog.csdnimg.cn/blog_migrate/090216fdad0e8ef05f34d0241fc9ffed.png)
在数值数据操作中,apply()
函数的功能是将一个自定义函数作用于DataFrame的行或者列;applymap()
函数的功能是将自定义函数作用于DataFrame的所有元素。他们通常也与匿名函数lambda一起使用。
df["数量"].apply(lambda x: x+1)
输出:
![bad8ff1fef1e3cda6d66352d5e6bd264.png](https://i-blog.csdnimg.cn/blog_migrate/12007a223bc50b3478c6946ea6dd5196.png)
文本数据操作
之前我们曾经介绍过经常被人忽视的:Pandas 文本型数据处理。在对文本型的数据进行处理时,我们会大量应用字符串的函数,来实现对一列文本数据进行操作[2]。
函数方法 | 用法释义 |
---|---|
cat | 字符串的拼接 |
contains | 判断某个字符串是否包含给定字符 |
startswith/endswith | 判断某个字符串是否以...开头/结尾 |
get | 获取指定位置的字符串 |
len | 计算字符串长度 |
upper、lower | 英文大小写转换 |
pad/center | 在字符串的左边、右边或左右两边添加给定字符 |
repeat | 重复字符串几次 |
slice_replace | 使用给定的字符串,替换指定的位置的字符 |
split | 分割字符串,将一列扩展为多列 |
strip、rstrip、lstrip | 去除空白符、换行符 |
findall | 利用正则表达式,去字符串中匹配,返回查找结果的列表 |
extract、extractall | 接受正则表达式,抽取匹配的字符串(一定要加上括号) |
举例:
df.insert(2, "姓名",
df["姓"].str.cat(df["名"], sep=""))
输出:
![63caf3a548a0b0bcfe91e72e683dd9ae.png](https://i-blog.csdnimg.cn/blog_migrate/96e51d6c24e922cd6324a19f434659b8.png)
df["手机号码"] = df["手机号码"].str.slice_replace(3,7,"*"*4)
输出:
![e2d99935be555d29820d863331cd09ec.png](https://i-blog.csdnimg.cn/blog_migrate/12906a42417dc8e8d7c48ec001534304.png)
df["地址"].str.extract("([\u4e00-\u9fa5]+)")
输出:
![eb6263d8731cee7ac50caed0bfc5e87f.png](https://i-blog.csdnimg.cn/blog_migrate/1405b3c602693dad72deee4ceed00b85.png)
行/列操作
数据清洗时,会将带空值的行删除,此时DataFrame或Series类型的数据不再是连续的索引,可以使用reset_index()
重置索引。
df.reset_index(drop=True)
输出:
![13437ccecd98b7796a2728fdd3031aa1.png](https://i-blog.csdnimg.cn/blog_migrate/05e67c506795af0a73eac882beb255c1.png)
rename()
重命名用于更改行列的标签,即行列的索引。可以传入一个字典或者一个函数。在数据预处理中,比较常用。
df.rename(columns={'mark': 'sell'}, inplace=True)
输出:
![761ab122d6bcbde214c6afd5d5bc99a0.png](https://i-blog.csdnimg.cn/blog_migrate/f4318173d027acd077d224eeeb2c7f51.png)
行列转置,我们可以使用T属性获得转置后的DataFrame。
df.T
输出:
![034f5209c5e3debcc0ff2e3f0b73ba53.png](https://i-blog.csdnimg.cn/blog_migrate/a037b3a0f4a33a10935d743c4cb4235a.png)
删除行列,可以使用drop()
。
df.drop(columns=["mark"])
输出:
![df115ec78eaed029f722838e2253bfd5.png](https://i-blog.csdnimg.cn/blog_migrate/d17d9f4bf7190e80907f4e4c2f169260.png)
数据分析师在进行数据处理时经常会遇到长宽表互转的情况,这也是一道常见的数据分析面试题。
melt()
方法可以将宽表转长表,即表格型数据转为树形数据。
df.melt(id_vars="姓名", var_name="科目", value_name="成绩")
输出:
![e77853e8c1aad5c241556e8352901ff1.png](https://i-blog.csdnimg.cn/blog_migrate/52f47ba2c6042bd421582463d8e8c541.png)
pivot()
方法可以将长表转宽表,即树形数据转为表格型数据。
df.pivot(index='姓名', columns='科目', values='成绩')
输出:
![877b884786c16babe8a71eb1be7defed.png](https://i-blog.csdnimg.cn/blog_migrate/6575e5cef36979908fe349e0ed0d35e1.png)
pivot()
其实就是用 set_index()
创建层次化索引,再用unstack()
重塑
df1.set_index(['姓名','科目']).unstack('科目')
![0f48c373bd6f86f288cbc811fc70f2c2.png](https://i-blog.csdnimg.cn/blog_migrate/51aaecc96498c5b9bc14cc23bb29933c.png)
数据分组与数据透视表更是一个常见的需求,groupby()
方法可以用于数据分组。
df.groupby("科目").mean()
![13c6772845797e34a38d9c3bc3c97746.png](https://i-blog.csdnimg.cn/blog_migrate/c731b155a0f01f58104f17bacd8dcad4.png)
由于pivot_table()
数据透视表的参数比较多,就不再使用案例来演示了,具体用法可参考下图。
![6e229d58d3fcaba82f48f2d2bd9c7d80.png](https://i-blog.csdnimg.cn/blog_migrate/474f32c8be7d33d69972b688fd7e39d7.png)
数据筛选
如果是筛选行列的话,通常有以下几种方法:
有时我们需要按条件选择部分列、部分行,一般常用的方法有:
操作 | 语法 | 返回结果 |
---|---|---|
选择列 | df[col] | Series |
按索引选择行 | df.loc[label] | Series |
按数字索引选择行 | df.iloc[loc] | Series |
使用切片选择行 | df[:5] | DataFrame |
用表达式筛选行[3] | df[bool_vec] | DataFrame |
除此以外,还有很多方法/函数可以用于“数据筛选”。
如果想直接筛选包含特定字符的字符串,可以使用contains()
这个方法。
例如,筛选户籍地址列中包含“黑龙江”这个字符的所有行。
df[df["户籍地址"].str.contains("黑龙江")]
query()
查询方法也可以用来筛选数据,比如查询“语文”成绩大于“数学”成绩的行记录。
df.query("语文 > 英语")
输出:
![4d381ff1604ed64522c23a7a3883abb4.png](https://i-blog.csdnimg.cn/blog_migrate/f76699d9e7d3c8b5a1fb564d5e5e6a0d.png)
select_dtypes()
方法可用于筛选某些数据类型的变量或列。举例,我们仅选择具有数据类型'int64'的列。
df.select_dtypes("int64")
输出:
![c13c2c7a031a79ece7679017d4fd1322.png](https://i-blog.csdnimg.cn/blog_migrate/06af1494389966235d2f8378a588385b.png)
isin()
接受一个列表,判断该列中元素是否在列表中。
name_list = ["张三", "李四"]
df[df["姓名"].isin(name_list)]
输出:
![2bb7c90adb0466e40aab9a0327afced5.png](https://i-blog.csdnimg.cn/blog_migrate/f27708ca44e8c669a17917d93c4eb14a.png)
数值数据统计运算
在对数值型的数据进行统计运算时,除了有算术运算、比较预算还有各种常见的汇总统计运行函数,具体如下表所示。
函数方法 | 用法释义 |
---|---|
count | 非NaN数据项计数 |
sum | 求和 |
mean | 平均值 |
median | 中位数 |
mode | 众数 |
max | 最大值 |
min | 最小值 |
std | 标准差 |
var | 方差 |
quantile | 分位数 |
skew | 返回偏态系数 |
kurt | 返回峰态系数 |
举例:
df["语文"].max()
输出:
155
最后,再说一个比较常用的统计运算函数——累加cumsum()
。
df["累计销量"] = df["销量"].cumsum()
输出:
![7083019ca04cc45704c132e31474d1fb.png](https://i-blog.csdnimg.cn/blog_migrate/aa965e04595fd180e399099312ecf129.png)
注:cumprod()
方法是指连乘,用于与连加一样,但使用频率较少。
今天我们盘点了66个Pandas函数合集,但实际还有很多函数在本文中没有介绍,包括时间序列、数据表的拼接与连接等等。此外,那些类似describe()
这种大家非常熟悉的方法都省去了代码演示。如果大家有在工作生活中进行“数据清洗”非常有用的Pandas函数,也可以在评论区交流。
参考资料
[1]
小小明-Pandas的clip和replace正则替换: https://blog.csdn.net/as604049322/article/details/105985763
[2]经常被人忽视的:Pandas文本型数据处理: https://mp.weixin.qq.com/s/Tdcb6jlyCc7XlQWZlvEd_w
[3]深入浅出Pandas: 利用Python进行数据处理与分析
◆ ◆ ◆ ◆ ◆
麟哥新书已经在当当上架了,我写了本书:《拿下Offer-数据分析师求职面试指南》,目前当当正在举行活动,大家可以用相当于原价5折的预购价格购买,还是非常划算的:
数据森麟公众号的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里交流关于数据分析&数据挖掘的相关内容,还没有加入的小伙伴可以扫描下方管理员二维码,进群前一定要关注公众号奥,关注后让管理员帮忙拉进群,期待大家的加入。
管理员二维码:
猜你喜欢
● 卧槽!原来爬取B站弹幕这么简单
● 厉害了!麟哥新书登顶京东销量排行榜!
● 笑死人不偿命的知乎沙雕问题排行榜
● 用Python扒出B站那些“惊为天人”的阿