Python数据分析系列之Pandas常用操作第四篇

214 阅读5分钟

这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战

Pandas 可以对各种数据进行运算操作,比如归并、再成形、选择,还有数据清洗和数据加工特征。Pandas 广泛应用在学术、金融、统计学等各个数据分析领域。 在进行数据分析前必须进行数据的清洗,剔除异常值和缺失值的处理。下面介绍Pandas在进行缺失值的一些处理方法和常用的描述性统计方法:

Pandas缺失值

Pandas中缺失使用NaN(not a number)表示,其值为numpy.nan。
Pandas中缺失值的产生:

  1. 例如传入的数据为Python的None或MySQL数据库的null
  2. 从Nupy对象中获取到的nan数据

构造测试数据:
下面的例子创建了包含有3个缺失值numpy.nan的DataFrame,numpy.nan在Pandas中被显示为NaN

In [5]: data = pd.DataFrame([[0, 1, np.nan, 3], [4, 5, np.nan, 7
   ...: ], [8, 9, 10, np.nan]], columns=['A', 'B', 'C', 'D'])

In [6]: data
Out[6]:
   A  B     C    D
0  0  1   NaN  3.0
1  4  5   NaN  7.0
2  8  9  10.0  NaN

第一种对缺失值的处理方法把所有的缺失值都统一替换为某一个值:例如在处理学生成绩时把缺考的同学的成绩统一记录为0分即可:
下面的操作方法是把所有的缺失值全部使用0来替换。
DataFrame.fillna(value=value): fillna方法是把DataFrame里面的所有缺失值即NaN替换为所提供的value。
把缺失值全部用0来替换:

In [8]: data.fillna(value=0)
Out[8]:
   A  B     C    D
0  0  1   0.0  3.0
1  4  5   0.0  7.0
2  8  9  10.0  0.0

第二种对缺失值的处理方法就是把存在缺失值的那个样本数据进行剔除。比如计算某公司部门的员工的平均薪资的时候应该对存在缺失值的员工进行剔除,不纳入统计样本里面,以免造成被平均,或者导致拉低整体平均薪资。
DataFrame对存在缺失值的数据进行剔除的方法是DataFrame.dropna(), 此方法将不对数据进行原地修改,返回删除缺失值后的DataFrame。下面的例子创建了4行数据,其中有3行都包含了缺失值,当执行DataFrame.dropna()时将会剔除掉包含缺失值的那三行数据,剩下数据完整的一行。
删除包含缺失值的行:

In [10]: data = pd.DataFrame([[0, 1, np.nan, 3], [4, 5, np.nan,
    ...: 7], [8, 9, 10, np.nan], [11, 22, 33, 44]], columns=['A'
    ...: , 'B', 'C', 'D'])

In [11]: data
Out[11]:
    A   B     C     D
0   0   1   NaN   3.0
1   4   5   NaN   7.0
2   8   9  10.0   NaN
3  11  22  33.0  44.0  

In [13]: data.dropna()
Out[13]:
    A   B     C     D
3  11  22  33.0  44.0

在数据处理中,我们需要知道数据中是否存在缺失值,例如需要判断全市的医疗保险参保情况调查中是否存在缺失值,那么DataFrame提供的方法是DataFrame.isna()。此方法将对DataFrame中所有元素进行判断,并且返回对应位置是否存在缺失值的布尔值。
把数据中是NaN的数据用True表示,不是的则用False表示:

In [14]: data.isna()
Out[14]:
       A      B      C      D
0  False  False   True  False
1  False  False   True  False
2  False  False  False   True
3  False  False  False  False

描述性统计操作

描述性统计分析要对调查总体所有变量的有关数据做统计性描述,主要包括数据的频数分析、数据的集中趋势分析、数据离散程度分析、数据的分布、以及一些基本的统计图形。
常见的指标有:均值、中位数、众数体现了数据的集中趋势。
极差、方差、标准差体现了数据的离散程度。
偏度、峰值体现了数据的分布形状。
在DataFrame中对这些常用指标的统计非常方便:
统计时,一般忽略排除掉NaN
DataFrame在统计平均数指标时的方法是DataFrame.mean()。可以指定按行还是按列进行统计平均数。 默认是按列进行统计平均数; 当mean(1)时,将会改变默认按列的方式统计平均数,进而按行来统计平均数。下面的例子是按列来统计平均数:
按列统计平均数(会自动抛弃NaN的值,所以只有第4行是所有数据参与计算平均数,其他行都是只有3个数参与计算):

In [21]: data
Out[21]:
    A   B     C     D
0   0   1   NaN   3.0
1   4   5   NaN   7.0
2   8   9  10.0   NaN
3  11  22  33.0  44.0

In [22]: data.mean()
Out[22]:
A     5.75
B     9.25
C    21.50
D    18.00
dtype: float64

下面的例子是按行来统计平均数(会自动抛弃NaN的值,所以C列只有10.0和33.0参与计算):
按行统计平均数:

In [23]: data
Out[23]:
    A   B     C     D
0   0   1   NaN   3.0
1   4   5   NaN   7.0
2   8   9  10.0   NaN
3  11  22  33.0  44.0

In [24]: data.mean(1)
Out[24]:
0     1.333333
1     5.333333
2     9.000000
3    27.500000
dtype: float64

在数据处理中,需要经常对字符串数据的进行处理,Pandas也提供了非常好的处理函数str供调用。
下面的例子创建了一个元素数据类型是字符串的Series对象,然后进行调用Pandas.str字符串处理方法。
Series.str.lower():对Series里面的每个字符串原始都进行小写,并且返回新对象,原Series不会被修改。

Series的字符串str方法, 返回新对象,不会原地修改数据:

In [25]: data = pd.Series(['HELLO', 'WORLD', 'RIDING', 'ROAD'])

In [26]: data.str.lower()
Out[26]:
0     hello
1     world
2    riding
3      road
dtype: object

In [27]: data
Out[27]:
0     HELLO
1     WORLD
2    RIDING
3      ROAD
dtype: object