Table of Contents
第二章第一节
内容相对比较基础
环境问题:pandas更新Jupyter不正常
Bad file descriptor (C:\ci\zeromq_1602704446950\work\src\epoll.cpp:100 )解决办法
任务2.1 缺失值观察与处理
常用的缺失值处理方法:
df.isnull()df.isna()df.dropna()df.fillna()其中: pandas.DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)
value scalar、dict、Series 或 DataFrame。用于替换 NaN 的值method backfill、bfill、pad、ffill 或 None。用于填充 NaN 值的方法axis 沿行(axis=0)或列(axis=1)填补缺失的数值inplace 布尔型。如果为 True,就地修改调用者 DataFramelimit 整数。 如果指定了 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)
axis 它决定轴是行还是列。 如果它是 0 或'index',那么它将删除包含缺失值的行。 如果它是 1 或'column',那么它将删除包含缺失值的列。默认情况下,它的值是 0how 这个参数决定函数如何删除行或列。它只接受两个字符串,可以是 all 或 all。默认情况下,它被设置为 any。 any - 如果行或列中有任何空值,就会删除它。 all - 如果行或列中缺少所有值,则放弃该行或列thresh 它是一个整数,指定了防止行或列丢失的非缺失值的最少数量subset 它是一个数组,其中有行或列的名称,用于指定列名inplace 它是一个布尔值,如果设置为 True,将就地改变调用者 DataFrame。默认情况下,它的值是 False【思考】检索空缺值用np.nan,None以及.isnull()哪个更好,这是为什么?如果其中某个方式无法找到缺失值,原因又是为什么?
【回答】本文件用isnull,np.nan,None都索引不到
任务2.3特征观察与处理
分箱操作:pd.cut/qcut()
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”=[1、2、3、4]表示(1,2],(2,3],(3,4],当bins是一个间隔索引时,该参数被忽略。labels : 数组或布尔值,可选.指定分箱的标签 如果是数组,长度要与分箱个数一致,比如“ bins”=[1、2、3、4]表示(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只能按比例分箱。
间隔索引举例:
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 属于 NaN0.5属于(0.0, 1.0]1.5属于NaN2.5属于(2.0, 3.0]4.5属于(4.0, 5.0]任务2.4 数据的合并
【思考】对比merge、join以及concat的方法的不同以及相同。思考一下在任务四和任务五的情况下,为什么都要求使用DataFrame的append方法,如何只要求使用merge或者join可不可以完成任务四和任务五呢?
【回答】
-
四种用法的区别 即,concat和merge既能行也能列,join只能列,append只能行
-
只要求使用merge或者join可不可以完成任务四和任务五呢?merge可以,join不可以
agg函数
小插曲
0x800700E1: 无法成功完成操作,因为文件包含病毒 很上头,准备打开WindowsTerminal用Hexo,结果刚打开就报错0x800700E1,然后尝试直接打开powershell,结果报毒,尝试了更新系统、关闭WindowsDefender,都没用,睡了一觉突然想到能不能重装powershell,于是装了个新版的powershell,问题解决了。