python实现的一些数据预处理

利用python进行数据分析和计算时,经常用到两种数据类型:数据框(DataFrame)和数组(array)。两种数据类型的转换、多个数据的合并以及计算数据中的最值等问题是频率较高的操作。下面介绍解决这些问题的方法。

首先导入python中最常用的数据处理两个模块:numpy模块、pandas模块。然后创建一个DataFrame类型数据df,两个数组arr1和arr2。

1
2
3
4
5
6
import numpy as np
import pandas as pd

df = pd.DataFrame({'A':[1,2,3],'B':[4,5,6],'C':[7,8,9]})
arr1= np.array([[21,22,23], [24,25,26]])
arr2 = np.array([[27,28,29], [31,32,33]])

数据类型转换

(1) DataFrame转换为array

  • 使用DataFrame中的values方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>> df
A B C
0 1 4 7
1 2 5 8
2 3 6 9
>>> type(df)
<class 'pandas.core.frame.DataFrame'>

>>> df_arr = df.values
>>> df_arr
array([[1, 4, 7],
[2, 5, 8],
[3, 6, 9]])
>>> type(df_arr)
<class 'numpy.ndarray'>
  • 使用Numpy中的array方法
1
2
3
4
5
6
7
>>> df_arr2 = np.array(df)
>>> df_arr2
array([[1, 4, 7],
[2, 5, 8],
[3, 6, 9]])
>>> type(df_arr2)
<class 'numpy.ndarray'>

(2) array转换为Data Frame

使用Pandas 的DataFrame方法

1
2
3
4
5
6
7
8
>>> df2 = pd.DataFrame(df_arr)
>>> df2
0 1 2
0 1 4 7
1 2 5 8
2 3 6 9
>>> type(df2)
<class 'pandas.core.frame.DataFrame'>

数据合并、拼接

数据合并常见的情况有两个数据框或数组进行水平或垂直方向的合并。

(1) DataFrame的合并

方法有:

  • pandas的merge函数

df = pd.merge(df1, df2, how='left', on='id')

how='left' 表示以df1为基准数据,on='id'表示合并时的索引ID

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>>> df1
A B C
0 1 4 7
1 2 5 8
2 3 6 9
>>> df2
A D E
0 1 40 70
1 2 50 80
2 3 60 90
>>> df3 = pd.merge(df1, df2, how='left', on='A')
>>> df3
A B C D E
0 1 4 7 40 70
1 2 5 8 50 80
2 3 6 9 60 90
  • pandas的concat函数

df = pd.concat(df1,df2, axis ), axis=1表示列拼接,axis=0表示行拼接

只是简单的只进行数据拼接,并不进行去除差异或相似的操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>> df4 = pd.concat([df1,df2],axis=0)
>>> df4
A B C D E
0 1 4.0 7.0 NaN NaN
1 2 5.0 8.0 NaN NaN
2 3 6.0 9.0 NaN NaN
0 1 NaN NaN 40.0 70.0
1 2 NaN NaN 50.0 80.0
2 3 NaN NaN 60.0 90.0
>>> df5 = pd.concat([df1,df2],axis=1)
>>> df5
A B C A D E
0 1 4 7 1 40 70
1 2 5 8 2 50 80
2 3 6 9 3 60 90

(2) Array的合并

方法包括以下几种,常见的有concatenate, stack,hstack和vastack

image-20200912224933250

原始数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>>> arr1= np.array([[21,22,23], [24,25,26]])
>>> arr2 = np.array([[27,28,29], [31,32,33]])
>>> arr1
array([[21, 22, 23],
[24, 25, 26]])
>>> arr2
array([[27, 28, 29],
[31, 32, 33]])
>>> type(arr1)
<class 'numpy.ndarray'>
>>> type(arr2)
<class 'numpy.ndarray'>
>>> arr1.shape
(2, 3)
>>> arr2.shape
(2, 3)
  • concatenate

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    >>> arr3=np.concatenate((arr1, arr2)) # 默认axis=0,行方向合并
    >>> arr3
    array([[21, 22, 23],
    [24, 25, 26],
    [27, 28, 29],
    [31, 32, 33]])
    >>> arr3.shape
    (4, 3)

    >>> arr4=np.concatenate((arr1, arr2),axis=1)
    >>> arr4
    array([[21, 22, 23, 27, 28, 29],
    [24, 25, 26, 31, 32, 33]])
  • stack

np.stack(())合并后的数据是多个数组,纬度增加。参数axis默认值为0.

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
>>> arr5 = np.stack((arr1, arr2))
>>> arr5
array([[[21, 22, 23],
[24, 25, 26]],

[[27, 28, 29],
[31, 32, 33]]])
>>> arr5.shape
(2, 2, 3)
>>> arr6 = np.stack((arr1, arr2),axis=0)
>>> arr6
array([[[21, 22, 23],
[24, 25, 26]],

[[27, 28, 29],
[31, 32, 33]]])
>>> arr6.shape
(2, 2, 3)
>>> arr7 = np.stack((arr1, arr2),axis=1)
>>> arr7
array([[[21, 22, 23],
[27, 28, 29]],

[[24, 25, 26],
[31, 32, 33]]])
  • hstack:水平合并, 数组纬度没变
1
2
3
>>> np.hstack((arr1,arr2))
array([[21, 22, 23, 27, 28, 29],
[24, 25, 26, 31, 32, 33]])
  • vstack:垂直合并,数组纬度没变
1
2
3
4
5
>>> np.vstack((arr1,arr2))
array([[21, 22, 23],
[24, 25, 26],
[27, 28, 29],
[31, 32, 33]])

最值

使用numpy的max/min函数

1
2
3
4
5
6
7
8
9
>>> arr1
array([[21, 22, 23],
[24, 25, 26]])
>>> np.max(arr1)
26
>>> np.max(arr1,axis=0)
array([24, 25, 26])
>>> np.max(arr1,axis=1)
array([23, 26])

参考资料