相关文章推荐
健壮的吐司  ·  How to do user login ...·  11 月前    · 
礼貌的机器人  ·  Dropdown menu color ...·  1 年前    · 
6个pandas数据处理小技巧,提升效率必备

6个pandas数据处理小技巧,提升效率必备

pandas是python中常用的数据分析库,出现频率非常高。而且pandas功能之多让人咋舌,即使pandas老手也没法保证能高效使用pandas做数据分析,这篇文章就是带大家梳理下那些可以自带buff的pandas小技巧。

1. 从剪切板中创建DataFrame

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

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


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

pd.read_clipboard()

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

2. 通过数据类型选择columns

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

import seaborn as sns
# 导出泰坦尼克数据集
df = sns.load_dataset('titanic')
df.head()

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

df.dtypes

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

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

df.select_dtypes(include='number').head()

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

df.select_dtypes(exclude='int').head()

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

df.select_dtypes(include=['int', 'datetime', 'object']).head()

3. 将strings改为numbers

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

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

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

import pandas as pd
df = pd.DataFrame({ 'product': ['A','B','C','D'], 
                   'price': ['10','20','30','40'],
                   'sales': ['20','-','60','-']

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

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

df.dtypes

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

df['price'] = df['price'].astype(int)
# 或者用另一种方式
df = df.astype({'price': 'int'})

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

df['sales'] = df['sales'].astype(int)

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

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

df['sales'] = pd.to_numeric(df['sales'], errors='coerce')

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

df.dtypes

4. 检测并处理缺失值

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

还是用泰坦尼克数据集:

import seaborn as sns
# 导出泰坦尼克数据集
df = sns.load_dataset('titanic')
df.info()

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

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

df.isnull().sum()

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

df.isnull().sum().sum()

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

df.isna().mean()

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

那如何处理缺失值呢?

两种方式:删除和替换。

删除包含缺失值的行:

df.dropna(axis = 0)

删除包含缺失值的列:

df.dropna(axis = 1)

如果一列里缺失值超过10%,则删除该列:

df.dropna(thresh=len(df)*0.9, axis=1)

用一个标量替换缺失值:

df.fillna(value=10)

用上一行对应位置的值替换缺失值:

df.fillna(axis=0, method='ffill')

用前一列对应位置的值替换缺失值:

df.fillna(axis=1, method='ffill')

用下一行对应位置的值替换缺失值:

df.fillna(axis=0, method='bfill')

用后一列对应位置的值替换缺失值:

df.fillna(axis=1, method='bfill')

使用某一列的平均值替换缺失值:

df['Age'].fillna(value=df['Age'].mean(), inplace=True)

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

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

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

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

import seaborn as sns
# 导出泰坦尼克数据集
df = sns.load_dataset('titanic')
df['age'].head()

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

import sys
df['ageGroup']=pd.cut(
                    df['age'], 
                    bins=[0, 13, 19, 61, sys.maxsize], 
                    labels=['儿童', '青少年', '成人', '老人']
df.head()