0%

Chapter02

第二章第一节

内容相对比较基础

环境问题:pandas更新Jupyter不正常

Bad file descriptor (C:\ci\zeromq_1602704446950\work\src\epoll.cpp:100)解决办法

任务2.1 缺失值观察与处理

常用的缺失值处理方法:

1
2
3
4
df.isnull()
df.isna()
df.dropna()
df.fillna()

其中:
pandas.DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
value     scalar、dict、Series 或 DataFrame。用于替换 NaN 的值  
method backfill、bfill、pad、ffill 或 None。用于填充 NaN 值的方法
axis 沿行(axis=0)或列(axis=1)填补缺失的数值
inplace 布尔型。如果为 True,就地修改调用者 DataFrame
limit 整数。
如果指定了 method,则是要向前/向后填充的连续 NaN 值的最大数量。
如果没有指定 method,则是要填充的轴的最大 NaN 值数
downcast 字典。指定转换的数据类型

如果 inplace 为 True,则用给定的 value 替换所有 NaN 值的 DataFrame;否则为 None

method 说明
backfill/bfill 用同一列中的 NaN 值之后的值填充 DataFrame 中所有的 NaN 值
ffill/pad 用同一列中的 NaN 值之前的值填充 DataFrame 中所有的 NaN 值

pandas.DataFrame.dropna(axis=0, how=’any’, thresh=None, subset=None, inplace=False)

1
2
3
4
5
6
7
8
9
axis    它决定轴是行还是列。
如果它是 0'index',那么它将删除包含缺失值的行。
如果它是 1'column',那么它将删除包含缺失值的列。默认情况下,它的值是 0
how 这个参数决定函数如何删除行或列。它只接受两个字符串,可以是 allall。默认情况下,它被设置为 any
any - 如果行或列中有任何空值,就会删除它。
all - 如果行或列中缺少所有值,则放弃该行或列
thresh 它是一个整数,指定了防止行或列丢失的非缺失值的最少数量
subset 它是一个数组,其中有行或列的名称,用于指定列名
inplace 它是一个布尔值,如果设置为 True,将就地改变调用者 DataFrame。默认情况下,它的值是 False

【思考】检索空缺值用np.nan,None以及.isnull()哪个更好,这是为什么?如果其中某个方式无法找到缺失值,原因又是为什么?

【回答】本文件用isnullnp.nan,None都索引不到

任务2.3特征观察与处理

分箱操作:pd.cut/qcut()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
pd.cut( x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates='raise', )

x : 一维数组
bins : 整数,标量序列或者间隔索引,是进行分组的依据,
如果填入整数n,则表示将x中的数值分成等宽的n份(即每一组内的最大值与最小值之差约相等);
如果是标量序列,序列中的数值表示用来分档的分界值
如果是间隔索引,“ bins”的间隔索引必须不重叠
right :布尔值,默认为True表示包含最右侧的数值
当“ right = True”(默认值)时,则“ bins”=[1234]表示(1,2],(2,3],(3,4],当bins是一个间隔索引时,该参数被忽略。
labels : 数组或布尔值,可选.指定分箱的标签
如果是数组,长度要与分箱个数一致,比如“ bins”=[1234]表示(1,2],(2,3],(3,4]一共3个区间,则labels的长度也就是标签的个数也要是3
如果为False,则仅返回分箱的整数指示符,即x中的数据在第几个箱子里,当bins是间隔索引时,将忽略此参数
retbins: 是否显示分箱的分界值。默认为False,当bins取整数时可以设置retbins=True以显示分界值,得到划分后的区间
precision:整数,默认3,存储和显示分箱标签的精度。
include_lowest:布尔值,表示区间的左边是开还是闭,默认为false,也就是不包含区间左边。
duplicates:如果分箱临界值不唯一,则引发ValueError或丢弃非唯一


#将连续变量Age按10% 30% 50 70% 90%五个年龄段,并用分类变量12345表示
df['AgeBand'] = pd.qcut(df['Age'],[0,0.1,0.3,0.5,0.7,0.9],labels = [1,2,3,4,5])
df.head()

即cut自定义水平较高,qcut只能按比例分箱。

间隔索引举例:

1
2
3
4
5
6
7
8
9
10
11
12
bins = pd.IntervalIndex.from_tuples([(0, 1), (2, 3), (4, 5)])  
pd.cut([0, 0.5, 1.5, 2.5, 4.5], bins)
[NaN, (0.0, 1.0], NaN, (2.0, 3.0], (4.0, 5.0]]
Categories (3, interval[int64, right]): [(0, 1] < (2, 3] < (4, 5]]

间隔索引就是自定义区间,不在区间内的数值不参与cut
[0, 0.5, 1.5, 2.5, 4.5]是源数据,[(0, 1), (2, 3), (4, 5)]是“划分标准”,[NaN, (0.0, 1.0], NaN, (2.0, 3.0], (4.0, 5.0]]是“划分结果”
0 属于 NaN
0.5属于(0.0, 1.0]
1.5属于NaN
2.5属于(2.0, 3.0]
4.5属于(4.0, 5.0]

任务2.4 数据的合并

思考】对比merge、join以及concat的方法的不同以及相同。思考一下在任务四和任务五的情况下,为什么都要求使用DataFrame的append方法,如何只要求使用merge或者join可不可以完成任务四和任务五呢?

回答

  1. 四种用法的区别 即,concat和merge既能行也能列,join只能列,append只能行

  2. 只要求使用merge或者join可不可以完成任务四和任务五呢?merge可以,join不可以

agg函数

pandas agg函数使用方法 - 简书

小插曲

0x800700E1: 无法成功完成操作,因为文件包含病毒 很上头,准备打开WindowsTerminal用Hexo,结果刚打开就报错0x800700E1,然后尝试直接打开powershell,结果报毒,尝试了更新系统、关闭WindowsDefender,都没用,睡了一觉突然想到能不能重装powershell,于是装了个新版的powershell,问题解决了。