首页
学习
活动
专区
圈层
工具
发布
50 篇文章
1
【原创佳作】介绍Pandas实战中一些高端玩法
2
pandas 如何实现 excel 中的汇总行?
3
pandas多级索引的骚操作!
4
40000字 Matplotlib 实操干货,真的全!
5
利用Python搞定女朋友的小情绪~
6
Python 绘制惊艳的瀑布图
7
6种方式创建多层索引
8
Python 进阶指南(编程轻松进阶):三、使用 Black 工具来格式化代码
9
数据科学 IPython 笔记本 9.6 聚合:最小、最大和之间的任何东西
10
精通 Pandas 探索性分析:1~4 全
11
高手系列!数据科学家私藏pandas高阶用法大全 ⛵
12
总结了67个pandas函数,完美解决数据处理,拿来即用!
13
PyAutoGUI,一个Python办公自动化利器!
14
解放双手|利用 PyAutoGUI 快速构建自动化操作脚本
15
Python中内置数据库!SQLite使用指南! ⛵
16
数据分析索引总结(中)Pandas多级索引
17
数据分析索引总结(下)Pandas索引技巧
18
数据分析索引总结(上)Pandas单级索引
19
网友需求系列01-Python-matplotlib定制化刻度(主副)绘制
20
用Python自动生成数据分析报告
21
手把手教你用Python操纵Word自动编写离职报告
22
pandas transform 数据转换的 4 个常用技巧!
23
30段极简Python代码:这些小技巧你都Get了么
24
数据处理遇到麻烦不要慌,5个优雅的Numpy函数助你走出困境
25
数据分析最有用的Top 50 Matplotlib图(带有完整的Python代码)(上)
26
数据分析最有用的Top 50 Matplotlib图(带有完整的Python代码)(下)
27
数据分析之Pandas变形操作总结
28
数据分析之Pandas缺失数据处理
29
数据分析之Pandas合并操作总结
30
数据分析之Pandas分组操作总结
31
学习用Pandas处理分类数据!
32
如何用Pandas处理文本数据?
33
Pandas处理时序数据(初学者必会)!
34
Python高阶函数使用总结!
35
机器学习在金融风控的经验总结!
36
你知道怎么用Pandas绘制带交互的可视化图表吗?
37
6个提升效率的pandas小技巧
38
Python数据分析库pandas高级接口dt和str的使用
39
pandas 拼接 concat 5 个常用技巧!
40
pandas分组8个常用技巧!
41
pandas 文本处理大全
42
pandas 筛选数据的 8 个骚操作
43
pandas 分类数据处理大全(附代码)
44
68 个Python内置函数,你用过几个?
45
太秀了!用 pandas 搞定 24 张 Excel 报表
46
用 Python 的 Template 类生成文件报告
47
码如其人,同学你能写一手漂亮的Python函数吗
48
Python处理图片九宫格,炫酷朋友圈
49
Python排序傻傻分不清?一文看透sorted与sort用法
50
python-docx操作word文件(
清单首页python文章详情

6个提升效率的pandas小技巧

这篇文章目的梳理几个高效实用的pandas小技巧,供大家参考。

1. 从剪切板中创建DataFrame

pandas中的read_clipboard()方法非常神奇,可以把剪切板中的数据变成dataframe格式,也就是说直接在excel中复制表格,可以快速转化为dataframe。

以下面这个excel数据表为例,全部选中,按ctrl+c复制:

然后在python中执行pd.read_clipboard(),就能得到一模一样的dataframe数据表:

代码语言:javascript
复制
pd.read_clipboard()

这功能对经常在excel和python中切换的分析师来说简直是福音,excel中的数据能一键转化为pandas可读格式。

2. 通过数据类型选择columns

数据分析过程可能会需要筛选数据列,比如只需要数值列,以经典的泰坦尼克数据集为例:

代码语言:javascript
复制
import seaborn as sns
# 导出泰坦尼克数据集
df = sns.load_dataset('titanic')
df.head()

查看该数据集各列的数据类型:

代码语言:javascript
复制
df.dtypes

可以看到各列的数据类型不太一样,有int、object、float、bool等。

如果说我只要需要数值列,也就是数据类型为int、float的列,可以通过select_dtypes方法实现:

代码语言:javascript
复制
df.select_dtypes(include='number').head()

选择除数据类型为int外其他的列,注意这里的参数是exclude

代码语言:javascript
复制
df.select_dtypes(exclude='int').head()

也可以选择多种数据类型:

代码语言:javascript
复制
df.select_dtypes(include=['int', 'datetime', 'object']).head()

3. 将strings改为numbers

在pandas中,有两种方法可以将字符串改为数值:

  • astype()方法
  • to_numeric()方法

先创建一个样本dataframe,看看这两种方法有什么不同。

代码语言:javascript
复制
import pandas as pd
df = pd.DataFrame({ 'product': ['A','B','C','D'], 
                   'price': ['10','20','30','40'],
                   'sales': ['20','-','60','-']
                  })
df

product列是字符串类型,price、sales列虽然内容有数字,但它们的数据类型也是字符串。

值得注意的是,price列都是数字,sales列有数字,但空值用-代替了。

代码语言:javascript
复制
df.dtypes

下面我们用astype()方法将price列的数据类型改为int:

代码语言:javascript
复制
df['price'] = df['price'].astype(int)
# 或者用另一种方式
df = df.astype({'price': 'int'})

但如果你同样用astype()方法更改sales列的话就会出现报错:

代码语言:javascript
复制
df['sales'] = df['sales'].astype(int)

原因是sales列里面的内容除了数字外还有-,它是字符串,没办法转化为int

to_numeric()方法却可以解决这一问题,只需要设置参数errors='coerce'

代码语言:javascript
复制
df['sales'] = pd.to_numeric(df['sales'], errors='coerce')

df

现在sale列中的-已经被替换成了NaN,它的数据类型也变成了float

代码语言:javascript
复制
df.dtypes

4. 检测并处理缺失值

有一种比较通用的检测缺失值的方法是info(),它可以统计每列非缺失值的数量。

还是用泰坦尼克数据集:

代码语言:javascript
复制
import seaborn as sns
# 导出泰坦尼克数据集
df = sns.load_dataset('titanic')
df.info()

标红色地方是有缺失值的列,并且给出了非缺失值的数量,你可以计算出该列有多少缺失值。

这样看可能不够直观,那可以用df.isnull().sum()方法很清楚地得到每列有多少缺失值:

代码语言:javascript
复制
df.isnull().sum()

df.isnull().sum().sum()则能够返回该数据集总共有多少缺失值:

代码语言:javascript
复制
df.isnull().sum().sum()

还可以看缺失值在该列的占比是多少,用df.isna().mean()方法:

代码语言:javascript
复制
df.isna().mean()

注意:这里isnull()isna()使用效果一样。

那如何处理缺失值呢?

两种方式:删除和替换。

  • 删除包含缺失值的行:
代码语言:javascript
复制
df.dropna(axis = 0)
  • 删除包含缺失值的列:
代码语言:javascript
复制
df.dropna(axis = 1)
  • 如果一列里缺失值超过10%,则删除该列:
代码语言:javascript
复制
df.dropna(thresh=len(df)*0.9, axis=1)
  • 用一个标量替换缺失值:
代码语言:javascript
复制
df.fillna(value=10)
  • 用上一行对应位置的值替换缺失值:
代码语言:javascript
复制
df.fillna(axis=0, method='ffill')
  • 用前一列对应位置的值替换缺失值:
代码语言:javascript
复制
df.fillna(axis=1, method='ffill')
  • 用下一行对应位置的值替换缺失值:
代码语言:javascript
复制
df.fillna(axis=0, method='bfill')
  • 用后一列对应位置的值替换缺失值:
代码语言:javascript
复制
df.fillna(axis=1, method='bfill')
  • 使用某一列的平均值替换缺失值:
代码语言:javascript
复制
df['Age'].fillna(value=df['Age'].mean(), inplace=True)

当然你还可以用最大最小值、分位数值等来替换缺失值。

5. 对连续数据进行离散化处理

在数据准备过程中,常常会组合或者转换现有特征以创建一个新的特征,其中将连续数据离散化是非常重要的特征转化方式,也就是将数值变成类别特征。

同样以泰坦尼克数据集为例,里面有一列是年龄特征age:

代码语言:javascript
复制
import seaborn as sns
# 导出泰坦尼克数据集
df = sns.load_dataset('titanic')
df['age'].head()

年龄是一段连续值,如果我们想对它进行分组变成分类特征,比如(<=12,儿童)、(<=18,青少年)、(<=60,成人)、(>60,老人),可以用cut方法实现:

代码语言:javascript
复制
import sys
df['ageGroup']=pd.cut(
                    df['age'], 
                    bins=[0, 13, 19, 61, sys.maxsize], 
                    labels=['儿童', '青少年', '成人', '老人']
                      )

df.head()

注意:这里的sys.maxsize是指可以存储的最大值。

可以看到新增了一列ageGroup,用以展示年龄分组:

代码语言:javascript
复制
df['ageGroup'].head()

6. 从多个文件中构建一个DataFrame

有时候数据集可能分布在多个excel或者csv文件中,但需要把它读取到一个DataFrame中,这样的需求该如何实现?

做法是分别读取这些文件,然后将多个dataframe组合到一起,变成一个dataframe。

这里使用内置的glob模块,来获取文件路径,简洁且更有效率。

在上图中,glob()在指定目录中查找所有以“ data_row_”开头的CSV文件。

glob()以任意顺序返回文件名,这就是为什么使用sort()函数对列表进行排序的原因。

「行合并」

假设数据集按行分布在2个文件中,分别是data_row_1.csv和data_row_2.csv

用以下方法可以逐行合并:

代码语言:javascript
复制
files = sorted(glob('data/data_row_*.csv'))
pd.concat((pd.read_csv(file) for file in files), ignore_index=True)

sorted(glob('data/data_row_*.csv'))返回文件名,然后逐个读取,并且使用concat()方法进行合并,得到结果:

「列合并」

假设数据集按列分布在2个文件中,分别是data_row_1.csv和data_row_2.csv

用以下方法可以逐列合并:

代码语言:javascript
复制
files = sorted(glob('data/data_col_*.csv'))
pd.concat((pd.read_csv(file) for file in files), axis=1)

sorted(glob('data/data_row_*.csv'))返回文件名,然后逐个读取,并且使用concat()方法进行列合并(注意这里axis=1),得到结果:

下一篇
举报
领券