6个冷门但实用的pandas知识点
共 2475字,需浏览 5分钟
·
2020-12-31 18:36
1. 简介
大家好,欢迎来到编程教室!
pandas
作为开展数据分析的利器,蕴含了与数据处理相关的丰富多样的API,使得我们可以灵活方便地对数据进行各种加工,但很多pandas
中的实用方法其实很多人都不熟悉,今天就来给大家介绍6个不太为人们所熟知的实用pandas
小技巧。
![](https://filescdn.proginn.com/0830a8603dceab6d053eff935eafcb86/23b50e854ca8e3f0919dd9dfb6b9a735.webp)
2. 6个实用的pandas
小知识
2.1 Series与DataFrame的互转
很多时候我们计算过程中产生的结果是Series
格式的,而接下来的很多操作尤其是使用「链式」语法时,需要衔接着传入DataFrame
格式的变量,这种时候我们就可以使用到pandas
中Series
向DataFrame
转换的方法:
「利用to_frame()实现Series转DataFrame」
s = pd.Series([0, 1, 2])
# Series转为DataFrame,name参数用于指定转换后的字段名
s = s.to_frame(name='列名')
s
![](https://filescdn.proginn.com/9f12abc31253f64fea08b0da5fe4ec2f/7cca372067a3b773cab14abdae294bb3.webp)
顺便介绍一下单列数据组成的数据框转为Series
的方法:
「利用squeeze()实现单列数据DataFrame转Series」
# 只有单列数据的DataFrame转为Series
s.squeeze()
![](https://filescdn.proginn.com/e9b78e92cfc151e82f0af840e4e8965c/6451e214cbf8667699fd93c8e68edb30.webp)
2.2 随机打乱DataFrame的记录行顺序
有时候我们需要对数据框整体的行顺序进行打乱,譬如在训练机器学习模型时,打乱原始数据顺序后取前若干行作为训练集后若干行作为测试集,这在pandas
中可以利用sample()
方法快捷实现。
sample()
方法的本质功能是从原始数据中抽样行记录,默认为不放回抽样,其参数frac
用于控制抽样比例,我们将其设置为1则等价于打乱顺序:
df = pd.DataFrame({
'V1': range(5),
'V2': range(5)
})
df.sample(frac=1)
![](https://filescdn.proginn.com/018c64179714e76616b0fb845718dca0/8a9b49fa7148400c237f1416cbc2fcc8.webp)
2.3 利用类别型数据减少内存消耗
当我们的数据框中某些列是由少数几种值大量重复形成时,会消耗大量的内存,就像下面的例子一样:
import numpy as np
pool = ['A', 'B', 'C', 'D']
# V1列由ABCD大量重复形成
df = pd.DataFrame({
'V1': np.random.choice(pool, 1000000)
})
# 查看内存使用情况
df.memory_usage(deep=True)
![](https://filescdn.proginn.com/57d94c01d02045b941e90b70f83c9a88/dbc83ed0a0ff8ec1da61bcb0e6bde3e4.webp)
这种时候我们可以使用到pandas
数据类型中的类别型来极大程度上减小内存消耗:
df['V1'] = df['V1'].astype('category')
df.memory_usage(deep=True)
![](https://filescdn.proginn.com/f8f4bf331decbe52ed1b2914fc18e57e/eccbc9d901337c08432bb9a9802b3698.webp)
可以看到,转换类型之后内存消耗减少了将近98.3%!
2.4 pandas中的object类型陷阱
在日常使用pandas
处理数据的过程中,经常会遇到object
这种数据类型,很多初学者都会把它视为字符串,事实上object
在pandas
中可以代表不确定的数据类型,即类型为object
的Series
中可以混杂着多种数据类型:
s = pd.Series(['111100', '111100', 111100, '111100'])
s
![](https://filescdn.proginn.com/a37d4d949390278a3df6f740a4c586a9/75aa3b53dd22fd7be1f4421ebc287f14.webp)
查看类型分布:
s.apply(lambda s: type(s))
![](https://filescdn.proginn.com/5e6ca70e6056d74c26fcf5301106b874/c82d9f02db84e8e9d0e9b6aaf5db9150.webp)
这种情况下,如果贸然当作字符串列来处理,对应的无法处理的元素只会变成缺失值而不报错,给我们的分析过程带来隐患:
s.str.replace('00', '11')
![](https://filescdn.proginn.com/aa48cca63463a5aada87b7c011c7e373/1a72e552f5b17f81a268e58ed1e58f25.webp)
这种时候就一定要先转成对应的类型,再执行相应的方法:
s.astype('str').str.replace('00', '11')
![](https://filescdn.proginn.com/1f8536829953ffd15e9f1a0b20599cf1/d112daece814c9813436c9e09cab0e0e.webp)
2.5 快速判断每一列是否有缺失值
在pandas
中我们可以对单个Series
查看hanans
属性来了解其是否包含缺失值,而结合apply()
,我们就可以快速查看整个数据框中哪些列含有缺失值:
df = pd.DataFrame({
'V1': [1, 2, None, 4],
'V2': [1, 2, 3, 4],
'V3': [None, 1, 2, 3]
})
df.apply(lambda s: s.hasnans)
![](https://filescdn.proginn.com/5659e789feff8e42b167fb50a0f6f573/556b8bba9abd29e0765f46582b6a8d62.webp)
2.6 使用rank()计算排名时的五种策略
在pandas
中我们可以利用rank()
方法计算某一列数据对应的排名信息,但在rank()
中有参数method
来控制具体的结果计算策略,有以下5种策略,在具体使用的时候要根据需要灵活选择:
「average」
在average
策略下,相同数值的元素的排名是其内部排名的均值:
s = pd.Series([1, 2, 2, 2, 3, 4, 4, 5, 6])
s.rank(method='average')
![](https://filescdn.proginn.com/b6a58e3350c7f74be4e4c26de2df7264/c9dd9af317ddd3103017c7b62dac8e3a.webp)
「min」
在min
策略下,相同元素的排名为其内部排名的最小值:
s.rank(method='min')
![](https://filescdn.proginn.com/71b3f37c121b60f80df81c1d66922152/33458b6aae453252bb06cbe97d5f5f52.webp)
「max」
max
策略与min
正好相反,取的是相同元素内部排名的最大值:
s.rank(method='max')
![](https://filescdn.proginn.com/4748b6b49ea50781d45d635d26dc1b6e/7960140452a895113f628f1d9b7eab53.webp)
「dense」
在dense
策略下,相当于对序列去重后进行排名,再将每个元素的排名赋给相同的每个元素,这种方式也是比较贴合实际需求的:
s.rank(method='dense')
![](https://filescdn.proginn.com/1e6577ac56005d127cf0eb60995e7227/9da67c86cd47f40d48d3d1ce53a57fd6.webp)
「first」
在first
策略下,当多个元素相同时,会根据这些相同元素在实际Series
中的顺序分配排名:
s = pd.Series([2, 2, 2, 1, 3])
s.rank(method='first')
![](https://filescdn.proginn.com/a159fe407d4379ed5f3f5a29372f4ce0/9a5065f07c3f8dd4611aa0cec95bbc17.webp)
关于pandas
还有很多实用的小知识,以后会慢慢给大家不定期分享~欢迎在评论区留言讨论。
_往期文章推荐_