这个姿势笔记,比较杂乱,记录学习过程的。

 第7章。数据清洗

"""
Series的map方法可以接受一个函数或含有映射关系的字典型对象,
使用map是一种实现元素级转换以及其他数据清理工作的便捷方式。
map 是一个常用的函数,可以使用它,对变量重新赋值,比如这样的。
"""

data = pd.DataFrame({'x':range(5), 'y':list('abcde')})
data
char2word = {
    'a':'apple',
    'b':'back',
    'c':'cat',
    'd':'desk',
    'e':'egg'
}

data['new'] = data['y'].map(char2word)
data

可以得到。

Python 基本统计分析_缺失值

'''
lower  和 title 可以大小写
'''
x = data['new'].str.title()
x.str.lower()

Python 基本统计分析_字符串处理_02

 


######################### ############ replace #########################


data = pd.Series([1., -999., 2., -999., -1000., 3.])
data
import numpy as np

data.replace(-999, np.nan)

data.replace([-999, -1000], np.nan)
data.replace([-999, -1000], [np.nan, 0])
data.replace({-999: np.nan, -1000: 0})

'''
replace 接受 单个值,列表, 字典,那么这样接受不?
'''
'''
data
data.replace([{-999, 2:0}, 3:333])
data.replace([[-999,3], 2],  [np.nan, 0])
### 这样不行
data.map({-999:2})
dat

Python 基本统计分析_缺失值_03

如果用replace, 那么没有对应值的就会被替换成缺失值。

 

data.map({'-999':np.nan})


结果就会全都是缺失值,因为其他的也是没有对应,都变成缺失。


rename 方法。

########################
########### 重命名 轴索引
########################

data = pd.DataFrame(np.arange(12).reshape((3, 4)),
                    index=['Ohio', 'Colorado', 'New York'],
                    columns=['one', 'two', 'three', 'four'])
data

transfom = lambda x: x[:4].upper()
'''
这个函数可以取单词的前4个字母,然后转换成大写。
'''
data.index.map(transfom)
'''
transorm是一个函数。
'''
data.index = data.index.map(transfom)
data

data.rename(index=str.title, columns=str.upper)
#### 可以这样直接写,挺方便的。
# 比如
frame = pd.DataFrame(np.arange(12).reshape(3, 4),
                      index = ['apple', 'basketboall', 'celebrate'],
                     columns = ['xmanufact', 'killing', 'zicker', 'tankre'])

frame
'''
这里又一个 range的坑
'''
np.arange(12).reshape(3, 4)
np.asarray(range(12)).reshape(3, 4) # 这样才行。
range(12).reshape(3, 4) # 这里用range 就会报错,因为,range不会产生 array, np.arange,才会产生有结构的sarray
#继续

transfom
frame.index.map(transfom)
frame.index = frame.index.map(transfom)
frame
frame
"""
这里 frame 已经修改了, 
如果想要创建数据集的转换版(而不是修改原始数据),比较实用的方法是 rename:
书中说, 
"""
frame.rename(index = str.title, columns = str.upper)
############特别说明一下,rename可以结合字典型对象实现对部分轴标签的更新:
frame
frame.rename(index = {'APPL':'huawei'}, columns = {'killing':'bill'})


data.rename(
    index={'OHIO': "INDIANA"},
    columns={'three': 'peekaboo'}
)
data

data.rename(index={'OHIO': "INDIANA"}, columns={'three': 'peekaboo'}, inplace=True)
data
'''
这里的rename 的方法很有趣, 可以直接接受一个 mapper, 像这样的,frame.rename(index = str.title, columns = str.upper) 
就是制定, 行的索引,按照字符串处理, 都变成大写的。列的索引都按照字符串处理,都变成大写的。
'''

然后是离散化方法, 就是使用cut

cut函数,

###########################################
##################  7.2  离散化和面元划分
###########################################



ages = [20, 22, 25, 27, 21, 23, 37, 31, 61, 45, 41, 32]
ages
bins = [18, 25, 35, 60, 100]
cats = pd.cut(ages, bins)

'''44
pandas返回的是一个特殊的Categorical对象。结
它的底层含有一个表示不同分类名称 的类型数组,以及一个codes属性中的年龄数据的标签
'''

# cats
cats.codes
cats.categories
# cats
# cats.keys()
# cats
# type(cats)
# pd.cut()
# cats.categories
# cats
# cats.Length
# cats.tolist()
# cats.ordered
pd.value_counts(cats)

Python 基本统计分析_python_04

 这个比较简单,可以再加一个 labels选项。也可以不加。

############### 过滤异常值

'''
7.2 检测和过滤异常值
'''


data = pd.DataFrame(np.random.randn(1000, 4))
data.describe()

col = data[2]
col
col[np.abs(col) > 3]

data
data.head()
data.columnnames =['a', 'b', 'c', 'd']
###################
#  columnnames 不会改变列的名字, 那会改变什么呢?
data
data.columns = ['a', 'b', 'c', 'd']
data[data['a'] > 3].idxmax()
data['a'] > 3
data[data['a'] > 3]
c = data['c']
c.idxmax()
c
data['c'].nlargest()
c.argmax(2)
np.argpartition(c, )
x = np.array([4, 3, 2, 1])
np.argpartition(x, 3)[0]
np.argpartition(x, 3)
np.argpartition(x,3)
np.argpartition(x,2)
np.argpartition(x,5)
np.argwhere(x, 3)

data[(np.abs(data)> 3).any(1)]
data[data>3].any(1)
(data>3).any(1)

######################### 看来必须用上面的方式写,
data[(data>3.5).any(1)]