数据预处理

以字典作为columns参数使用rename来重命名列是我最喜欢的方式,因为它能同时为多个列重命名。如果想同时为所有的列重命名,下面这一小段代码会很有用。它以旧列名为键、空字符串为值,创建了一个字典:

import collections

column_names = collections.defaultdict(str)

for name in df.columns:
    column_names[name]

column_names

'''
defaultdict(str,
            {'Name': '',
             'PClass': '',
             'Age': '',
             'Sex': '',
             'Survived': '',
             'SexCode': ''})
'''

除了解决方案中用到的描述性统计量,pandas还提供了计算方差(var)、标准差(std)、峰态(kurt)、偏态(skew)、平均值标准误差(sem)、众数(mode)、中位数(median)以及很多其他描述性统计量的方法。

print('Maximum: {}'.format(df['Age'].max()))
print('Minimum: {}'.format(df['Age'].min()))
print('Mean: {}'.format(df['Age'].mean()))
print('Sum: {}'.format(df['Age'].sum()))
print('Count: {}'.format(df['Age'].count()))


'''
'Maximum: 71.0'
'Minimum: 0.17'
'Mean: 30.397989417989418'
'Sum: 22980.88'
'Count: 756'
'''


print("Variance: {}".format(df.var()))
print("Standard Deviation: {}".format(df.std()))
print("Kurtosis: {}".format(df.kurt()))
print("Skewness: {}".format(df.skew()))


'''
Variance: Age         203.320470
Survived      0.225437
SexCode       0.228230
dtype: float64
Standard Deviation: Age         14.259049
Survived     0.474802
SexCode      0.477734
dtype: float64
Kurtosis: Age        -0.036536
Survived   -1.562162
SexCode    -1.616702
dtype: float64
Skewness: Age         0.368511
Survived    0.663491
SexCode     0.621098
dtype: float64
'''

使用unique来查看由某一列中全部的唯一值组成的数组:

# unique will return an array of all unique values in a column
df['Sex'].unique()

'''
array(['female', 'male'], dtype=object)
'''
# value_counts will display all unique values with the number of times each value appears
df['Sex'].value_counts()

'''
male      851
female    462
Name: Sex, dtype: int64
'''

unique和value_counts都可以用来处理和探索分类型数据的(categorical)列。在数据整理阶段,分类型数据的列中经常会有一些分类需要处理。例如,在泰坦尼克号的数据集中,PClass这个列是用来表示乘客船票级别的。泰坦尼克号中有三种级别的船票,而如果使用value_counts,我们就能看出数据中的一个问题:

df['PClass'].value_counts()

'''
3rd    711
1st    322
2nd    279
*        1
Name: PClass, dtype: int64

'''

如我们所设想的那样,几乎所有乘客的船票都在这三种级别中,但有一位乘客的船票级别是*。有很多种策略能处理这种类型的问题,在第5章会详细介绍。现在,我们只需要认识到“异常”类型的数据在分类型数据中很常见,不应该忽视它们。

最后,如果你只是想统计有多少个唯一值,则可以使用nunique:

df['PClass'].nunique()
'''
4
'''

isnull和notnull都能返回布尔型的值来表示一个值是否缺失:

# select missing values, show 2 rows
df[df['Age'].isnull()].head(2)

在数据整理中,缺失值是很常见的问题,很多人都低估了处理缺失值的难度。pandas使用NumPy的NaN(“Not A Number”,意为“不是一个数字”)来表示缺失值。但值得注意的是,pandas没有实现NaN。例如,如果想要将所有包含male的字符串替换为缺失值的话,就会得到一条错误消息:

df['Sex'] = df['Sex'].replace('male', NaN)

'''
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-47-920ce92da9c6> in <module>
----> 1 df['Sex'] = df['Sex'].replace('male', NaN)

NameError: name 'NaN' is not defined
'''
# 修正

import numpy as np

df['Sex'] = df['Sex'].replace('male', np.nan)

有时候一个数据集会使用特殊的值来表示缺失的观察值,比如NONE、-999或者.。pandas的read_csv中有一个参数,允许用户指定一个值来代表缺失值:

df = pd.read_csv(url,na_values =[np.nan, 'NONE', -999])

最好养成一个习惯,永远不使用pandas的inplace=True参数。很多pandas的方法都包含一个inplace参数,当其被设置为True时,会直接修改数据帧本身。在对数据进行一系列更复杂的处理时,这可能会产生一些问题,因为数据帧会被视为可变对象(严格来说确实是这样的)。我推荐将数据帧视为不可变对象。例如:

dateframe_name_dropped = df.drop(df.columns[0], axis = 1)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值