一些杂乱的思考
# 康复训练
A B C D
a 75 80 98 56 -- [[75,80,98,56]
b 10 69 78 48 [10,69,78,48]
c 42 52 51 52 [42,52,51,52]]
取第一行第二行 df.iloc[:2,:]
取第一列第二列 df.iloc[:,:2]
取第一行第三行 df.iloc[[0,2],:]
取第一列第三列 df.iloc[:,[0,2]]
取第二行 不降维 df.iloc[[1],:]
取第二行 降维 df.iloc[1,:]
取第二列 不降维 df.iloc[:,[1]]
取第二列 降维 df.iloc[:,1]
取第二列的前两个元素 不降维 df1.iloc[:2,[1]]
取第二列的前两个元素 降维 df1.iloc[:2,1]
取第二列和第四列的前两个元素 df1.iloc[:2,[1,3]]
将元素52取出来 df1.iloc[2,1]
取第二列和第四列的第一个元素和第三个元素
- 按照numpy的思维,就该这样写 df1.iloc[[0,2],:].iloc[:[1,3]]
- 但在pandas中,可以直接 df1.iloc[[0,2],[1,3]] -- 取四线交点区域的元素,不降维; numpy中这样是取01 23位置的元素,降维
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 强行记忆
就二维而言,简单记忆,axis=0表示行,axis=1表示列
eg:
- Serise
s4.shape s4.size s4.index s4.values
s4.head(2)
s4.tail(2)
s4.unique() 返回去重后的结果, 并将值放到了一个numpy对象中
s4.nunique() 返回去重后元素的个数
s4.value_counts() 返回元素出现的次数
s4.isnull() 会对series对象中的每个成员都进行空值判定
s4.notnull()
>> s3[s3.notnull()] 过滤空值
>> s3[s3.isnull()] 保留空值
Serise对象.std()
Serise对象.max()
Serise对象.min()
Serise对象.idxmax()
Serise对象.idxmin()
Serise对象.to_dict() 变成字典,一般用于map映射
- DataFrame
- df.drop(index=0, axis=0, inplace=True)
> labels:要删除的列或者行,如果要删除多个,传入列表
> index:指定的一行或多行
> columns:指定的一列或多列
> inplace:是否生效
> axis:轴的方向,0为行,1为列,默认为0
df1.values df1.columns df1.index df1.shape df1.size
df1.head(2)
df1.tail(2)
df1.info() # 可以通过它判定某列有没有空值
df1.describe()
df1.isnull()
df1.notnull()
df1.isnull().any(axis=1)
df1.notnull().all(axis=1)
df1.iloc[[True,True,False,False,True]]
df1.loc[[True,True,False,False,True]]
df1[[True,True,False,False,True]]
这三者是一样的效果.
注意:
iloc接受有返回值的函数作为参数,但要保证函数返回的是整数/整数list,布尔值/布尔list.
So,若是bool值的Serise对象,iloc不行,loc可以.
dataframe对象通过 iloc、loc得到的视图 对其赋值标量 eg: df.iloc[3:7,:] = 2 会自动向量化 影响原DataFrame对象
那得到的视图的行索引不是连续的,重组索引,会影响原DataFrame对象吗?
df.loc[df.notnull().all(axis=1)].reset_index(drop=True, inplace=True) 测试下来,好像不会.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# ★ Numpy
- 运算+-*/><等 向量化
- (3,4,5) 第一第二第三个括号里有多少个成员,对应轴axios 0,1,2
- numpy的切片是视图,对其赋值,会影响原数组 - 赋值标量是向量化影响的
- numpy的切片和索引
- 基本索引
单个索引降维"取出",切片不降维"保留"!
思维方式:‘以三维的为例’ 对0轴的成员、1轴的成员、2轴的成员依次操作!
- numpy花式索引/列表索引
索引列表不降维'保留',单个索引降维"取出",切片不降维"保留"!
思维方式:‘以二维的为例’ 对0轴的成员、1轴的成员 依次操作! 操作的方式得包含索引列表.
索引列表&索引列表是个特殊情况,得到的是一个一维数组;
- ★ 综上: numpy数组n维, arr[操作,操作,操作] 对0轴的成员、1轴的成员、..、n-1轴的成员依次操作!
操作的方式有三种,索引列表不降维'保留',切片不降维"保留",单个索引降维"取出"
<索引列表和切片同样是保留,但索引列表多用于针对不连续的情况,切片多用于连续的情况 并且索引列表可以处理保留的顺序>
特殊情况 - 索引列表&索引列表得到的是一个一维数组;
- bool索引,以二维数组为例
1.传入1维bool数组,取行
2.二维数据[二维数组进行逻辑运算得到的就是一个二维bool数组]=标量 -- 进行了元素替换
- 矩阵/二维数组
np.where(arr>0,2,arr) 原数组arr是没有改变的
arr[arr>0]=2 直接在原数组arr上改变
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# ★ Pandas之Serise
- 三部分组成: index、value、dtype
- 把Serise看作是一个一维数组,操作啥的跟一维数组没啥区别
- 显式索引取值 s4['语文'] s4[0]
1
2
3
2
3
# ★ Pandas之DataFrame
特殊的 -- df['A']
取列; df[:-1]
取行; df[0] 取列,仅隐式索引时使用.
- 组成: 行索引 index + 列索引 columns + 值 values.
- DataFrame把它看作是一个字典 {'列索引A':{'行索引b':值,'行索引p':值},'列索引B':{'行索引b':值,'行索引p':值}}
外层字典的value值/里层的字典 就是一个Serise对象, 多个Serise对象使用共同的索引.
基于这个理解. df['debt'] 取列 ; df['debt']=2 有则改,没有则新增列 就很容易想通啦!
- DataFrame是表格型数据,把它对标numpy的二维数组,很多操作都是类似的!
Bool索引,DataFrame中的应用跟numpy中的操作一模一样.
- DataFrame的索引和切片 iloc、loc跟numpy中的一样,只是(花式索引&索引列表 有一点不一样.)
DataFrame中所说的降维是得到一个Serise对象.
iloc适配下标索引,loc适配显式索引,并且loc中使用显式索引切片是包含最后一个的!!
# 探究下axis参数. Hhh -- 以结果反推. 二维而言,大部分的情况每一行的数据沿着轴的方向进行运算.
>>> df1 = pd.DataFrame(data=[[1,2],[3,4],[5,6]])
>>> df1
0 1
0 1 2
1 3 4
2 5 6
>>> df1.iloc[0,1] = np.nan
>>> df1
0 1
0 1 NaN
1 3 4.0
2 5 6.0
>>> df1.isnull().any(axis=0)
0 False
1 True
dtype: bool
>>> df1.isnull().any(axis=1)
0 True
1 False
2 False
dtype: bool
>>> df1
0 1
0 1 NaN
1 3 4.0
2 5 6.0
>>> df1.dropna(axis=0)
0 1
1 3 4.0
2 5 6.0
>>> df1
0 1
0 1 NaN
1 3 4.0
2 5 6.0
>>> df1.dropna(axis=1)
0
0 1
1 3
2 5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# ★ Pandas之数据清洗
■ 空值删除
- ex = df.isnull().any(axis=1)
df[~ex]
- ex = df.notnull().all(axis=1)
df[ex]
- df.dropna(axis=0)
■ 空值填充
- df.fillna(method='bfill',axis=0)
- mean_value = df[col].mean()
df[col].fillna(value=mean_value, inplace=True)
■ 重复行删除
df.drop_duplicates(inplace=True) # 删除重复行
df.reset_index(drop=True, inplace=True) # 解决删除重复行后,行索引值不连续的问题
Ps: df.duplicated() 返回一个bool值的Serise对象,为True表明该行是重复行
■ 异常值清洗
★ 一组数据要么是正太的要么就是偏态的..
正太或对称分布的用标准差法; 不对称的或偏态的用MAD法; 不知道数据是正态还是偏态 先用四分位数法试试..
在后面讲数据挖掘时,有方法验证数据是正态还是偏态的..
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18