Pandas常见方法(2)-pandas对数据的预处理

说明:本blog基于python3, pandas 1.3.5版本


前言

本文主要介绍如何对数据做预处理,包括 缺失值过滤、缺失值补全、数据转换(重复值删除,数据映射、数据替换)、简单运算自动对齐与函数处理、统计运算和排序,共5个部分。并附有代码实例。
【注:本文所有部分根据pandas中的基础数据结构进行分类讲解,Series 和 DataFrame】

一、对缺失值处理

1.1 缺失值过滤

使用dropna方法,
公式: DataFrame.dropna(axis = 0/1, how = “all”, thresh =按衡量标准 删除的最小Nan值个数, subset = [“目标列”])

代码如下

import pandas as pd
import numpy as np

a = pd.DataFrame([[1,2,np.nan],[np.nan,2,3], [np.nan, np.nan, np.nan], [3,5,7]])
print(a)
###过滤缺失值

###删除所有包含缺失值的行
a1 = a.dropna(axis = 0)
print(("删除所有包含Nan值的行 \n{}").format(a1))

###删除所有包含Nan值的列
a2 = a.dropna(axis = 1)
print(("删除所有包含Nan值的列 \n{}").format(a2))

##删除行元素全为Nan值的行
a3 = a.dropna(how = "all", axis = 0)
print(("删除行元素全为Nan值的行 \n{}").format(a3))

结果如下

 0    1    2
0  1.0  2.0  NaN
1  NaN  2.0  3.0
2  NaN  NaN  NaN
3  3.0  5.0  7.0
删除所有包含Nan值的行 
     0    1    2
3  3.0  5.0  7.0
删除所有包含Nan值的列 
Empty DataFrame
Columns: []
Index: [0, 1, 2, 3]
删除行元素全为Nan值的行 
     0    1    2
0  1.0  2.0  NaN
1  NaN  2.0  3.0
3  3.0  5.0  7.0

1.2 缺失值补全

DataFrame.fillna(字典形式的按列填充/常数值, method = “ffill”/“bfill”, axis = 0/1, inplace = True/False)
【注:axis = 0代表按列填充,axis = 1代表按行填充;这里的0,1与pandas其他方法的0,1不同!!!】

import pandas as pd
import numpy as np

a = pd.DataFrame([[1,2,np.nan],[np.nan,2,3], [np.nan, np.nan, np.nan], [3,5,7]])
print(a)

###按列后填充, 并返回“视图”
a.fillna(method = "bfill", inplace= True, axis = 0)
print("填充后的DataFrame:")
print(a)

结果如下,

     0    1    2
0  1.0  2.0  NaN
1  NaN  2.0  3.0
2  NaN  NaN  NaN
3  3.0  5.0  7.0
填充后的DataFrame:
     0    1    2
0  1.0  2.0  3.0
1  3.0  2.0  3.0
2  3.0  5.0  7.0
3  3.0  5.0  7.0

二、数据转换

2.1 某列重复值删除

公式:DataFrame.drop_duplicates(subset = 列索引组成的列表,inplace = True/False)

import pandas as pd
import numpy as np

a = pd.DataFrame([[1,2,np.nan],[np.nan,2,3], [np.nan, np.nan, np.nan], [3,5,7]])
print(a)
a.drop_duplicates(subset = [1], inplace = True)
print(a)

结果如下

     0    1    2
0  1.0  2.0  NaN
1  NaN  2.0  3.0
2  NaN  NaN  NaN
3  3.0  5.0  7.0
     0    1    2
0  1.0  2.0  NaN
2  NaN  NaN  NaN
3  3.0  5.0  7.0

2.2 某列/某些列数据映射

公式:原DataFrame[新列索引] = Series.map(一个字典类型的映射/一个函数)
假设我们对列索引为0的列做map操作,形成一个新列,命名为“map_relationship”个DataFrame,代码如下

import pandas as pd
import numpy as np

a = pd.DataFrame([[1,2,np.nan],[np.nan,2,3], [np.nan, 20, np.nan], [3,5,7]])
print(a)

map_relationship = {1:"a", 2:"b",3:"c", 4:"d"}
###对列索引为0的列做map操作,形成一个新列,命名为“map_relationship”
a["map_relationship"] = a[0].map(map_relationship)
print(a)

结果如下

     0   1    2
0  1.0   2  NaN
1  NaN   2  3.0
2  NaN  20  NaN
3  3.0   5  7.0
     0   1    2 map_relationship
0  1.0   2  NaN                a
1  NaN   2  3.0              NaN
2  NaN  20  NaN              NaN
3  3.0   5  7.0                c

2.3 某列数据替换

公式: DataFrame[列索引].replace(被替换值= 替换值, inplace = True/False)
【注:只要inplace参数为True,则返回DataFrame的“视图”】

代码如下

import pandas as pd
import numpy as np

a = pd.DataFrame([[1,2,np.nan],[np.nan,2,3], [np.nan, 20, np.nan], [3,5,7]])
print(a)
###只对列索引为0的列中的Nan值做替换,替换为999
a[0].replace(np.nan, 999, inplace = True)
print(a)

结果如下

     0   1    2
0  1.0   2  NaN
1  NaN   2  3.0
2  NaN  20  NaN
3  3.0   5  7.0
       0   1    2
0    1.0   2  NaN
1  999.0   2  3.0
2  999.0  20  NaN
3    3.0   5  7.0

2.4 DataFrame所有数据替换

公式: DataFrame.replace(被替换值= 替换值, inplace = True/False)
【注:只要inplace参数为True,则返回DataFrame的“视图”】

代码如下

import pandas as pd
import numpy as np

a = pd.DataFrame([[1,2,np.nan],[np.nan,2,3], [np.nan, 20, np.nan], [3,5,7]])
print(a)
###对所有元素中的Nan值做替换,替换为999
a.replace(np.nan, 999, inplace = True)
print(a)

结果如下

     0   1    2
0  1.0   2  NaN
1  NaN   2  3.0
2  NaN  20  NaN
3  3.0   5  7.0
       0   1      2
0    1.0   2  999.0
1  999.0   2    3.0
2  999.0  20  999.0
3    3.0   5    7.0

三、分箱和分位数

遇到离散型数据,我们通常采用分箱(即分段)或计算分位数的办法从统计学角度整体认知样本数据

分箱方法公式:pd.cut(必须为一维数组, bins = 分段区间点组成的列表, labels = 每段区间的组名组成的列表, ordered = True/False)
【注:其中分段区间默认包含左右两个边界点;如果需要取掉右边界,使用right = False】

代码如下

import pandas as pd
import numpy as np

a = pd.Series([1,2,10,3,55,200,70,8,93,67])
print(a)
b = pd.cut(a,bins = [-10,50,150,500], labels = ["small","middle","big"], ordered = True)
print(b)

结果如下

0      1
1      2
2     10
3      3
4     55
5    200
6     70
7      8
8     93
9     67
dtype: int64
0     small
1     small
2     small
3     small
4    middle
5       big
6    middle
7     small
8    middle
9    middle
dtype: category
Categories (3, object): ['small' < 'middle' < 'big']

分位数公式:新变量 = pd.qcut(几分位数就填几)
接下来,我们对上边生成的a计算25%,50%,75%,100%共四个分位数;并计算每个分位区间的样本数
代码如下

c = pd.qcut(a, 4)
print(c)
d = c.value_counts()
print(d)

结果如下

0     (0.999, 4.25]
1     (0.999, 4.25]
2      (4.25, 32.5]
3     (0.999, 4.25]
4     (32.5, 69.25]
5    (69.25, 200.0]
6    (69.25, 200.0]
7      (4.25, 32.5]
8    (69.25, 200.0]
9     (32.5, 69.25]
dtype: category
Categories (4, interval[float64, right]): [(0.999, 4.25] < (4.25, 32.5] < (32.5, 69.25] <
                                           (69.25, 200.0]]
(0.999, 4.25]     3
(69.25, 200.0]    3
(4.25, 32.5]      2
(32.5, 69.25]     2
dtype: int64

以上结果说明,对于一维数组a而言,
25%分位数是4.25,共3个元素
50%分位数是32.5,共5个元素
75%分位数是69.25,共7个元素
100%分位数是200,共10个元素


总结

写在最后,pandas对数据的预处理在本文中都已涵盖,希望对你的学习有帮助

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
数据预处理数据分析和机器学习任务是一个重要的步骤,而pandas是一个功能强大的Python库,常用于数据处理和分析。下面是一些常见数据预处理任务,可以使用pandas来完成: 1. 读取数据:使用pandas可以方便地从各种数据源(如CSV文件、Excel文件、数据库等)读取数据,例如使用`read_csv()`函数读取CSV文件。 2. 缺失值处理:通过使用`isna()`函数检测缺失值,并使用`fillna()`函数填充缺失值,或者使用`dropna()`函数删除缺失值。 3. 数据转换:可以使用`astype()`函数将数据类型转换为其他类型,例如将字符串类型转换为数值类型。 4. 数据清洗:对于一些不符合逻辑或错误的数据,可以使用条件语句和逻辑运算符进行清洗。 5. 数据排序和过滤:使用`sort_values()`函数对数据进行排序,使用条件语句和逻辑运算符对数据进行过滤。 6. 数据合并和拆分:可以使用`concat()`函数将多个数据集合并成一个,使用`split()`函数将一个数据集拆分成多个。 7. 特征工程:通过创建新的特征、特征编码、特征缩放等方式对数据进行特征工程,以提高模型的性能。 8. 数据归一化和标准化:使用`MinMaxScaler`或`StandardScaler`等类对数据进行归一化或标准化处理。 9. 数据离散化:使用`cut()`函数将连续型数据进行离散化处理,例如将年龄分成不同的年龄段。 10. 数据抽样:使用`sample()`函数对数据进行随机抽样,可以指定抽样比例或抽样数量。 这些只是数据预处理的一部分任务,pandas还提供了更多功能和方法来处理数据。需要根据具体的数据和任务来选择使用哪些方法和函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Efred.D

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值