pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple¶

pandas数据结构¶

In [2]:
import numpy as np
import pandas as pd # pandas基于NumPy,升级

Series¶

In [2]:
# Series
l = np.array([1,2,3,6,9]) # NumPy数组

s1 = pd.Series(data = l)
display(l,s1) # Series是一维的数组,和NumPy数组不一样:Series多了索引
array([1, 2, 3, 6, 9])
0    1
1    2
2    3
3    6
4    9
dtype: int64
In [3]:
s2 = pd.Series(data = l,index = list('ABCDE'))
s2
Out[3]:
A    1
B    2
C    3
D    6
E    9
dtype: int64
In [4]:
s3 = pd.Series(data = {'A':149,'B':130,'C':118,'D':99,'E':66})
s3
Out[4]:
A    149
B    130
C    118
D     99
E     66
dtype: int64

DataFrame¶

In [5]:
# Series是一维的,功能比较少
# DataFrame是二维的,多个Series公用索引,组成了DataFrame
# 像不像 Excel,所有数据,结构化
df1 = pd.DataFrame(data = np.random.randint(0,151,size = (10,3)),
                   index = list('ABCDEFHIJK'), # 行索引
                   columns=['Python','Math','En'],dtype=np.float16) # 列索引
df1
Out[5]:
Python Math En
A 120.0 132.0 8.0
B 54.0 137.0 139.0
C 30.0 108.0 57.0
D 14.0 99.0 99.0
E 2.0 112.0 110.0
F 127.0 29.0 25.0
H 46.0 82.0 7.0
I 7.0 82.0 37.0
J 49.0 88.0 71.0
K 73.0 35.0 18.0
In [6]:
df2 = pd.DataFrame(data = {'Python':[66,99,128],'Math':[88,65,137],'En':[100,121,45]})
df2 # 字典,key作为列索引,不指定index默认从0开始索引,自动索引一样
Out[6]:
Python Math En
0 66 88 100
1 99 65 121
2 128 137 45

数据查看¶

In [7]:
df = pd.DataFrame(data = np.random.randint(0,151,size = (100,3)),
                  columns=['Python','Math','En'])
df
Out[7]:
Python Math En
0 25 4 56
1 141 62 84
2 139 117 30
3 36 130 1
4 56 10 17
5 88 7 87
6 149 44 69
7 141 137 40
8 78 137 76
9 108 101 39
10 32 86 77
11 44 31 106
12 71 9 133
13 17 111 61
14 7 108 58
15 55 56 129
16 84 57 103
17 73 114 138
18 145 111 128
19 51 34 75
20 21 10 24
21 101 104 19
22 64 43 69
23 9 137 65
24 120 87 1
25 69 104 71
26 134 105 127
27 74 25 97
28 93 98 104
29 122 38 23
... ... ... ...
70 130 117 43
71 145 28 101
72 129 131 63
73 142 34 61
74 95 126 61
75 127 93 69
76 38 99 100
77 12 85 88
78 133 83 65
79 52 111 4
80 10 2 91
81 109 135 126
82 24 5 106
83 67 69 21
84 18 150 112
85 49 149 66
86 50 132 98
87 0 89 17
88 125 115 14
89 38 31 73
90 41 44 19
91 101 65 89
92 41 124 73
93 146 9 112
94 127 132 46
95 87 49 92
96 13 136 7
97 84 98 83
98 51 50 142
99 18 79 138

100 rows × 3 columns

In [8]:
df.shape # 查看DataFrame形状
Out[8]:
(100, 3)
In [9]:
df.head(n = 3) # 显示前N个,默认N = 5
Out[9]:
Python Math En
0 25 4 56
1 141 62 84
2 139 117 30
In [10]:
df.tail() # 显示后n个
Out[10]:
Python Math En
95 87 49 92
96 13 136 7
97 84 98 83
98 51 50 142
99 18 79 138
In [11]:
df.dtypes # 数据类型
Out[11]:
Python    int64
Math      int64
En        int64
dtype: object
In [12]:
df.info() # 比较详细信息
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 100 entries, 0 to 99
Data columns (total 3 columns):
Python    100 non-null int64
Math      100 non-null int64
En        100 non-null int64
dtypes: int64(3)
memory usage: 2.4 KB
In [13]:
df.describe() # 描述:平均值、标准差、中位数、四等分、最大值,最小值
Out[13]:
Python Math En
count 100.000000 100.000000 100.000000
mean 79.010000 76.410000 72.890000
std 43.478427 44.458378 40.720505
min 0.000000 0.000000 1.000000
25% 43.250000 35.500000 40.750000
50% 82.500000 84.000000 72.000000
75% 112.500000 114.250000 103.250000
max 149.000000 150.000000 145.000000
In [14]:
df.values # 值,返回的是NumPy数组
Out[14]:
array([[ 25,   4,  56],
       [141,  62,  84],
       [139, 117,  30],
       [ 36, 130,   1],
       [ 56,  10,  17],
       [ 88,   7,  87],
       [149,  44,  69],
       [141, 137,  40],
       [ 78, 137,  76],
       [108, 101,  39],
       [ 32,  86,  77],
       [ 44,  31, 106],
       [ 71,   9, 133],
       [ 17, 111,  61],
       [  7, 108,  58],
       [ 55,  56, 129],
       [ 84,  57, 103],
       [ 73, 114, 138],
       [145, 111, 128],
       [ 51,  34,  75],
       [ 21,  10,  24],
       [101, 104,  19],
       [ 64,  43,  69],
       [  9, 137,  65],
       [120,  87,   1],
       [ 69, 104,  71],
       [134, 105, 127],
       [ 74,  25,  97],
       [ 93,  98, 104],
       [122,  38,  23],
       [ 27, 150,  30],
       [ 99,  34, 144],
       [ 89,  34,  80],
       [ 14, 109,  57],
       [108,  38,  68],
       [133,  36, 136],
       [ 94, 102,  66],
       [ 62, 125,  64],
       [138,  40, 134],
       [ 65, 110,  48],
       [ 69, 115,  30],
       [123,  19,  43],
       [105,  85,  29],
       [ 87,  71,  41],
       [ 69,  24,  94],
       [ 93, 120,  99],
       [110, 107, 130],
       [102,  15, 132],
       [  3,  51,  23],
       [146,  75,  94],
       [ 99,  33,  84],
       [ 82,   7,  83],
       [133,  11, 108],
       [103,  54,  21],
       [145,   0,  16],
       [106,  86,  51],
       [103, 107,  55],
       [ 38, 111, 145],
       [ 14,  62, 118],
       [ 72,  66,  10],
       [ 50,  53,  14],
       [ 76, 115, 140],
       [ 57,  12, 123],
       [  3,  40,  85],
       [127, 131,   1],
       [ 83, 143,  34],
       [ 89,  81,  44],
       [140, 137,  88],
       [ 33,  30, 116],
       [ 63, 115, 124],
       [130, 117,  43],
       [145,  28, 101],
       [129, 131,  63],
       [142,  34,  61],
       [ 95, 126,  61],
       [127,  93,  69],
       [ 38,  99, 100],
       [ 12,  85,  88],
       [133,  83,  65],
       [ 52, 111,   4],
       [ 10,   2,  91],
       [109, 135, 126],
       [ 24,   5, 106],
       [ 67,  69,  21],
       [ 18, 150, 112],
       [ 49, 149,  66],
       [ 50, 132,  98],
       [  0,  89,  17],
       [125, 115,  14],
       [ 38,  31,  73],
       [ 41,  44,  19],
       [101,  65,  89],
       [ 41, 124,  73],
       [146,   9, 112],
       [127, 132,  46],
       [ 87,  49,  92],
       [ 13, 136,   7],
       [ 84,  98,  83],
       [ 51,  50, 142],
       [ 18,  79, 138]])
In [15]:
df.columns # 列索引
Out[15]:
Index(['Python', 'Math', 'En'], dtype='object')
In [16]:
df.index # 行索引 0 ~ 99
Out[16]:
RangeIndex(start=0, stop=100, step=1)

数据输入与输出¶

csv¶

In [17]:
df = pd.DataFrame(data = np.random.randint(0,151,size = (100,3)),
                  columns=['Python','Math','En'])
df # 行索引,列索引
Out[17]:
Python Math En
0 127 38 97
1 91 32 90
2 24 64 133
3 62 43 111
4 123 77 56
5 134 35 3
6 99 28 89
7 74 50 80
8 26 45 96
9 113 99 59
10 49 37 83
11 55 45 53
12 106 107 30
13 131 77 38
14 43 105 56
15 20 40 3
16 16 22 15
17 48 85 59
18 79 123 85
19 70 52 42
20 76 62 25
21 35 116 27
22 75 98 44
23 100 21 117
24 26 36 73
25 101 113 111
26 86 129 96
27 127 44 101
28 112 97 15
29 116 43 146
... ... ... ...
70 146 93 94
71 121 70 0
72 30 118 58
73 103 71 104
74 113 93 68
75 27 96 70
76 6 81 54
77 26 90 113
78 101 3 124
79 70 138 115
80 135 122 114
81 66 65 100
82 33 12 14
83 120 54 38
84 14 38 133
85 45 70 84
86 100 86 25
87 67 27 34
88 33 147 17
89 20 43 44
90 19 140 132
91 150 144 18
92 111 84 87
93 84 56 99
94 148 62 8
95 123 24 36
96 57 75 90
97 77 98 42
98 117 112 107
99 89 56 52

100 rows × 3 columns

In [18]:
df.to_csv('./data.csv',sep = ',',
          index = True, # 保存行索引
          header=True) # 保存列索引
In [19]:
df.to_csv('./data2.csv',sep = ',',
          index = False, # 不保存行索引
          header=False) # 不保存列索引
In [20]:
pd.read_csv('./data.csv',
            index_col=0) # 第一列作为行索引
Out[20]:
Python Math En
0 127 38 97
1 91 32 90
2 24 64 133
3 62 43 111
4 123 77 56
5 134 35 3
6 99 28 89
7 74 50 80
8 26 45 96
9 113 99 59
10 49 37 83
11 55 45 53
12 106 107 30
13 131 77 38
14 43 105 56
15 20 40 3
16 16 22 15
17 48 85 59
18 79 123 85
19 70 52 42
20 76 62 25
21 35 116 27
22 75 98 44
23 100 21 117
24 26 36 73
25 101 113 111
26 86 129 96
27 127 44 101
28 112 97 15
29 116 43 146
... ... ... ...
70 146 93 94
71 121 70 0
72 30 118 58
73 103 71 104
74 113 93 68
75 27 96 70
76 6 81 54
77 26 90 113
78 101 3 124
79 70 138 115
80 135 122 114
81 66 65 100
82 33 12 14
83 120 54 38
84 14 38 133
85 45 70 84
86 100 86 25
87 67 27 34
88 33 147 17
89 20 43 44
90 19 140 132
91 150 144 18
92 111 84 87
93 84 56 99
94 148 62 8
95 123 24 36
96 57 75 90
97 77 98 42
98 117 112 107
99 89 56 52

100 rows × 3 columns

In [21]:
pd.read_csv('./data2.csv',header =None)
Out[21]:
0 1 2
0 127 38 97
1 91 32 90
2 24 64 133
3 62 43 111
4 123 77 56
5 134 35 3
6 99 28 89
7 74 50 80
8 26 45 96
9 113 99 59
10 49 37 83
11 55 45 53
12 106 107 30
13 131 77 38
14 43 105 56
15 20 40 3
16 16 22 15
17 48 85 59
18 79 123 85
19 70 52 42
20 76 62 25
21 35 116 27
22 75 98 44
23 100 21 117
24 26 36 73
25 101 113 111
26 86 129 96
27 127 44 101
28 112 97 15
29 116 43 146
... ... ... ...
70 146 93 94
71 121 70 0
72 30 118 58
73 103 71 104
74 113 93 68
75 27 96 70
76 6 81 54
77 26 90 113
78 101 3 124
79 70 138 115
80 135 122 114
81 66 65 100
82 33 12 14
83 120 54 38
84 14 38 133
85 45 70 84
86 100 86 25
87 67 27 34
88 33 147 17
89 20 43 44
90 19 140 132
91 150 144 18
92 111 84 87
93 84 56 99
94 148 62 8
95 123 24 36
96 57 75 90
97 77 98 42
98 117 112 107
99 89 56 52

100 rows × 3 columns

Excel¶

In [22]:
df
Out[22]:
Python Math En
0 127 38 97
1 91 32 90
2 24 64 133
3 62 43 111
4 123 77 56
5 134 35 3
6 99 28 89
7 74 50 80
8 26 45 96
9 113 99 59
10 49 37 83
11 55 45 53
12 106 107 30
13 131 77 38
14 43 105 56
15 20 40 3
16 16 22 15
17 48 85 59
18 79 123 85
19 70 52 42
20 76 62 25
21 35 116 27
22 75 98 44
23 100 21 117
24 26 36 73
25 101 113 111
26 86 129 96
27 127 44 101
28 112 97 15
29 116 43 146
... ... ... ...
70 146 93 94
71 121 70 0
72 30 118 58
73 103 71 104
74 113 93 68
75 27 96 70
76 6 81 54
77 26 90 113
78 101 3 124
79 70 138 115
80 135 122 114
81 66 65 100
82 33 12 14
83 120 54 38
84 14 38 133
85 45 70 84
86 100 86 25
87 67 27 34
88 33 147 17
89 20 43 44
90 19 140 132
91 150 144 18
92 111 84 87
93 84 56 99
94 148 62 8
95 123 24 36
96 57 75 90
97 77 98 42
98 117 112 107
99 89 56 52

100 rows × 3 columns

In [23]:
df.to_excel('./data.xls')
In [24]:
pd.read_excel('./data.xls',
              index_col=0) # 第一列作为行索引
Out[24]:
Python Math En
0 127 38 97
1 91 32 90
2 24 64 133
3 62 43 111
4 123 77 56
5 134 35 3
6 99 28 89
7 74 50 80
8 26 45 96
9 113 99 59
10 49 37 83
11 55 45 53
12 106 107 30
13 131 77 38
14 43 105 56
15 20 40 3
16 16 22 15
17 48 85 59
18 79 123 85
19 70 52 42
20 76 62 25
21 35 116 27
22 75 98 44
23 100 21 117
24 26 36 73
25 101 113 111
26 86 129 96
27 127 44 101
28 112 97 15
29 116 43 146
... ... ... ...
70 146 93 94
71 121 70 0
72 30 118 58
73 103 71 104
74 113 93 68
75 27 96 70
76 6 81 54
77 26 90 113
78 101 3 124
79 70 138 115
80 135 122 114
81 66 65 100
82 33 12 14
83 120 54 38
84 14 38 133
85 45 70 84
86 100 86 25
87 67 27 34
88 33 147 17
89 20 43 44
90 19 140 132
91 150 144 18
92 111 84 87
93 84 56 99
94 148 62 8
95 123 24 36
96 57 75 90
97 77 98 42
98 117 112 107
99 89 56 52

100 rows × 3 columns

HDF5¶

In [116]:
df.to_hdf('./data.h5',key = 'score')
In [117]:
df2 = pd.DataFrame(data = np.random.randint(6,100,size = (1000,5)),
                   columns=['计算机','化工','生物','工程','教师'])
df2
Out[117]:
计算机 化工 生物 工程 教师
0 58 37 52 31 98
1 29 91 49 49 27
2 85 28 53 34 21
3 79 93 72 50 93
4 16 9 44 87 15
5 86 13 52 40 6
6 44 56 97 86 24
7 38 22 96 87 33
8 88 9 21 20 63
9 6 49 36 90 46
10 67 55 81 86 52
11 32 58 66 94 25
12 41 91 31 68 97
13 20 58 39 93 48
14 6 73 88 25 53
15 87 70 17 21 63
16 32 71 87 12 29
17 10 11 40 45 96
18 85 45 68 88 91
19 48 50 65 39 81
20 78 78 18 14 87
21 25 7 43 96 46
22 26 62 16 58 17
23 38 81 85 47 40
24 31 24 19 69 44
25 68 28 87 71 46
26 69 94 88 60 17
27 64 18 89 18 48
28 97 80 38 47 30
29 33 85 32 96 20
... ... ... ... ... ...
970 95 49 38 17 21
971 81 66 18 72 25
972 7 87 99 7 22
973 60 21 17 72 90
974 52 92 79 16 66
975 7 80 29 71 63
976 52 46 80 70 49
977 53 31 49 93 80
978 26 46 23 73 27
979 50 6 76 74 6
980 7 40 22 98 53
981 71 45 92 47 8
982 96 15 43 58 27
983 55 47 44 65 52
984 92 78 15 34 63
985 43 75 52 73 85
986 29 19 82 49 32
987 32 94 7 20 49
988 27 24 48 35 18
989 54 14 8 85 43
990 65 19 78 66 19
991 34 16 70 68 6
992 98 83 7 37 88
993 36 19 72 56 61
994 43 12 78 30 34
995 8 41 46 85 87
996 20 35 83 13 76
997 76 84 56 40 72
998 9 20 66 39 18
999 91 42 91 81 53

1000 rows × 5 columns

In [118]:
df2.to_hdf('./data.h5',key = 'salary')
In [119]:
pd.read_hdf('./data.h5',key = 'salary')
Out[119]:
计算机 化工 生物 工程 教师
0 58 37 52 31 98
1 29 91 49 49 27
2 85 28 53 34 21
3 79 93 72 50 93
4 16 9 44 87 15
5 86 13 52 40 6
6 44 56 97 86 24
7 38 22 96 87 33
8 88 9 21 20 63
9 6 49 36 90 46
10 67 55 81 86 52
11 32 58 66 94 25
12 41 91 31 68 97
13 20 58 39 93 48
14 6 73 88 25 53
15 87 70 17 21 63
16 32 71 87 12 29
17 10 11 40 45 96
18 85 45 68 88 91
19 48 50 65 39 81
20 78 78 18 14 87
21 25 7 43 96 46
22 26 62 16 58 17
23 38 81 85 47 40
24 31 24 19 69 44
25 68 28 87 71 46
26 69 94 88 60 17
27 64 18 89 18 48
28 97 80 38 47 30
29 33 85 32 96 20
... ... ... ... ... ...
970 95 49 38 17 21
971 81 66 18 72 25
972 7 87 99 7 22
973 60 21 17 72 90
974 52 92 79 16 66
975 7 80 29 71 63
976 52 46 80 70 49
977 53 31 49 93 80
978 26 46 23 73 27
979 50 6 76 74 6
980 7 40 22 98 53
981 71 45 92 47 8
982 96 15 43 58 27
983 55 47 44 65 52
984 92 78 15 34 63
985 43 75 52 73 85
986 29 19 82 49 32
987 32 94 7 20 49
988 27 24 48 35 18
989 54 14 8 85 43
990 65 19 78 66 19
991 34 16 70 68 6
992 98 83 7 37 88
993 36 19 72 56 61
994 43 12 78 30 34
995 8 41 46 85 87
996 20 35 83 13 76
997 76 84 56 40 72
998 9 20 66 39 18
999 91 42 91 81 53

1000 rows × 5 columns

SQL¶

In [120]:
from sqlalchemy import create_engine # 数据库引擎,构建和数据库的连接
In [121]:
# PyMySQL
# 类似网页地址
engine = create_engine('mysql+pymysql://root:12345678@yaong/pandas?charset=utf8')
In [122]:
import pymysql
conn = pymysql.connect(host="yaong",user="root",password="12345678",charset="utf8mb4")
cursor = conn.cursor()
sql = "create database if not exists pandas"
cursor.execute(sql)
Out[122]:
1
In [123]:
df2.to_sql('salary',engine,index=False) # 将Python中数据DataFrame保存到Mysql
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-123-3a9887b691ad> in <module>
----> 1 df2.to_sql('salary',engine,index=False) # 将Python中数据DataFrame保存到Mysql

/usr/local/lib64/python3.6/site-packages/pandas/core/generic.py in to_sql(self, name, con, schema, if_exists, index, index_label, chunksize, dtype, method)
   2529         sql.to_sql(self, name, con, schema=schema, if_exists=if_exists,
   2530                    index=index, index_label=index_label, chunksize=chunksize,
-> 2531                    dtype=dtype, method=method)
   2532 
   2533     def to_pickle(self, path, compression='infer',

/usr/local/lib64/python3.6/site-packages/pandas/io/sql.py in to_sql(frame, name, con, schema, if_exists, index, index_label, chunksize, dtype, method)
    458     pandas_sql.to_sql(frame, name, if_exists=if_exists, index=index,
    459                       index_label=index_label, schema=schema,
--> 460                       chunksize=chunksize, dtype=dtype, method=method)
    461 
    462 

/usr/local/lib64/python3.6/site-packages/pandas/io/sql.py in to_sql(self, frame, name, if_exists, index, index_label, schema, chunksize, dtype, method)
   1171                          if_exists=if_exists, index_label=index_label,
   1172                          schema=schema, dtype=dtype)
-> 1173         table.create()
   1174         table.insert(chunksize, method=method)
   1175         if (not name.isdigit() and not name.islower()):

/usr/local/lib64/python3.6/site-packages/pandas/io/sql.py in create(self)
    573             if self.if_exists == 'fail':
    574                 raise ValueError(
--> 575                     "Table '{name}' already exists.".format(name=self.name))
    576             elif self.if_exists == 'replace':
    577                 self.pd_sql.drop_table(self.name, self.schema)

ValueError: Table 'salary' already exists.
In [125]:
df3 = pd.read_sql('select * from salary limit 50',con = engine)
df3
Out[125]:
计算机 化工 生物 工程 教师
0 21 50 63 80 88
1 85 49 96 82 34
2 22 51 22 91 17
3 15 72 84 22 19
4 7 84 6 58 35
5 18 62 74 30 96
6 78 81 80 34 31
7 37 26 79 10 60
8 23 51 72 63 27
9 41 81 47 55 25
10 52 93 61 26 65
11 82 15 23 86 27
12 12 15 9 84 48
13 10 66 7 78 15
14 54 85 81 97 81
15 60 21 72 58 27
16 13 91 34 15 11
17 49 23 22 32 65
18 16 55 44 93 95
19 59 10 56 10 65
20 86 66 46 11 48
21 72 10 67 57 57
22 38 86 12 15 37
23 26 40 53 21 71
24 7 58 75 80 12
25 78 26 67 69 90
26 56 60 91 48 69
27 41 87 75 26 8
28 94 41 24 81 6
29 24 41 94 47 86
30 81 38 55 32 31
31 45 69 42 36 73
32 94 89 97 82 55
33 39 30 50 93 18
34 78 52 52 39 36
35 12 30 20 57 16
36 9 24 99 44 82
37 25 65 33 95 98
38 32 86 99 46 18
39 53 50 42 34 60
40 7 33 64 97 21
41 57 59 11 18 95
42 57 79 52 9 68
43 28 8 82 99 19
44 39 84 31 11 76
45 44 79 46 41 58
46 39 87 32 32 58
47 17 80 54 97 23
48 16 70 21 19 91
49 67 56 43 73 65
In [126]:
df4 = pd.read_sql("show databases", con = engine)
df4
Out[126]:
Database
0 information_schema
1 accountdb
2 azkaban
3 ebiz
4 game
5 hivemetadata
6 lg_logstic
7 maxwell
8 mysql
9 pandas
10 performance_schema
11 scm
12 sqoop
13 superset_demo
14 sys
15 talents
16 test

数据选取¶

获取数据¶

In [127]:
df = pd.DataFrame(np.random.randint(0,151,size = (10,3)),
                  index=list('ABCDEFHIJK'),columns=['Python','Math','En'])
df
Out[127]:
Python Math En
A 7 120 93
B 0 100 2
C 112 21 96
D 6 13 83
E 6 11 19
F 83 8 134
H 47 137 138
I 74 47 5
J 43 66 67
K 49 112 75
In [128]:
df['Python'] # 获取数据Series
Out[128]:
A      7
B      0
C    112
D      6
E      6
F     83
H     47
I     74
J     43
K     49
Name: Python, dtype: int64
In [129]:
df.Python # 属性,DataFrame中列索引,表示属性
Out[129]:
A      7
B      0
C    112
D      6
E      6
F     83
H     47
I     74
J     43
K     49
Name: Python, dtype: int64
In [130]:
df[['Python','En']] # 获取多列数据
Out[130]:
Python En
A 7 93
B 0 2
C 112 96
D 6 83
E 6 19
F 83 134
H 47 138
I 74 5
J 43 67
K 49 75

标签选择¶

In [131]:
# 标签,就是行索引 location = loc 位置
df.loc['A']
Out[131]:
Python      7
Math      120
En         93
Name: A, dtype: int64
In [132]:
df.loc[['A','F','K']]
Out[132]:
Python Math En
A 7 120 93
F 83 8 134
K 49 112 75
In [133]:
df.loc['A','Python']
Out[133]:
7
In [134]:
df.loc[['A','C','F'],'Python']
Out[134]:
A      7
C    112
F     83
Name: Python, dtype: int64
In [135]:
df.loc['A'::2,['Math','En']]
Out[135]:
Math En
A 120 93
C 21 96
E 11 19
H 137 138
J 66 67
In [136]:
df.loc['A':'D',:]
Out[136]:
Python Math En
A 7 120 93
B 0 100 2
C 112 21 96
D 6 13 83

位置选择¶

In [137]:
df.iloc[0]
Out[137]:
Python      7
Math      120
En         93
Name: A, dtype: int64
In [138]:
df.iloc[[0,2,4]]
Out[138]:
Python Math En
A 7 120 93
C 112 21 96
E 6 11 19
In [139]:
df.iloc[0:4,[0,2]]
Out[139]:
Python En
A 7 93
B 0 2
C 112 96
D 6 83
In [140]:
df.iloc[3:8:2]
Out[140]:
Python Math En
D 6 13 83
F 83 8 134
I 74 47 5

boolean索引¶

In [141]:
cond = df.Python > 80 # 将Python大于80分的成绩获取
df[cond]
Out[141]:
Python Math En
C 112 21 96
F 83 8 134
In [142]:
cond = df.mean(axis = 1) > 75 # 平均分大于75,优秀,筛选出来
df[cond]
Out[142]:
Python Math En
C 112 21 96
H 47 137 138
K 49 112 75
In [143]:
cond = (df.Python > 70) & (df.Math > 70)
df[cond]
Out[143]:
Python Math En
In [144]:
cond = df.index.isin(['C','E','H','K']) # 判断数据是否在数组中
df[cond] # 删选出来了符合条件的数据
Out[144]:
Python Math En
C 112 21 96
E 6 11 19
H 47 137 138
K 49 112 75

赋值操作¶

In [145]:
df['Python']['A'] = 150 # 修改某个位置的值
df
Out[145]:
Python Math En
A 150 120 93
B 0 100 2
C 112 21 96
D 6 13 83
E 6 11 19
F 83 8 134
H 47 137 138
I 74 47 5
J 43 66 67
K 49 112 75
In [146]:
df['Java'] = np.random.randint(0,151,size = 10) # 新增加一列
df
Out[146]:
Python Math En Java
A 150 120 93 83
B 0 100 2 117
C 112 21 96 1
D 6 13 83 10
E 6 11 19 125
F 83 8 134 106
H 47 137 138 144
I 74 47 5 25
J 43 66 67 126
K 49 112 75 149
In [147]:
df.loc[['C','D','E'],'Math'] = 147 # 修改多个人的成绩
df
Out[147]:
Python Math En Java
A 150 120 93 83
B 0 100 2 117
C 112 147 96 1
D 6 147 83 10
E 6 147 19 125
F 83 8 134 106
H 47 137 138 144
I 74 47 5 25
J 43 66 67 126
K 49 112 75 149
In [148]:
cond = df < 60
df[cond] = 60 # where 条件操作,符合这条件值,修改,不符合,不改变
In [149]:
df
Out[149]:
Python Math En Java
A 150 120 93 83
B 60 100 60 117
C 112 147 96 60
D 60 147 83 60
E 60 147 60 125
F 83 60 134 106
H 60 137 138 144
I 74 60 60 60
J 60 66 67 126
K 60 112 75 149
In [150]:
df.iloc[3::3,[0,2]] += 100
In [151]:
df
Out[151]:
Python Math En Java
A 150 120 93 83
B 60 100 60 117
C 112 147 96 60
D 160 147 183 60
E 60 147 60 125
F 83 60 134 106
H 160 137 238 144
I 74 60 60 60
J 60 66 67 126
K 160 112 175 149

数据集成¶

concat数据串联¶

In [152]:
# np.concatenate NumPy数据集成
df1 = pd.DataFrame(np.random.randint(0,151,size = (10,3)),
                   columns=['Python','Math','En'],
                   index = list('ABCDEFHIJK'))
df2 = pd.DataFrame(np.random.randint(0,151,size = (10,3)),
                   columns = ['Python','Math','En'],
                   index = list('QWRTUYOPLM'))
df3 = pd.DataFrame(np.random.randint(0,151,size = (10,2)),
                  columns=['Java','Chinese'],index = list('ABCDEFHIJK'))
In [153]:
pd.concat([df1,df2],axis = 0) # axis = 0变是行合并,行增加
Out[153]:
Python Math En
A 86 63 16
B 17 148 13
C 67 47 32
D 36 144 37
E 79 76 39
F 105 28 27
H 49 57 106
I 15 52 31
J 18 105 64
K 146 22 48
Q 27 134 80
W 78 73 98
R 150 119 28
T 23 44 79
U 54 86 141
Y 145 27 81
O 75 33 40
P 121 91 85
L 147 50 111
M 42 144 18
In [154]:
pd.concat([df1,df3],axis = 1) # axis = 1表示列增加
Out[154]:
Python Math En Java Chinese
A 86 63 16 56 149
B 17 148 13 76 140
C 67 47 32 128 10
D 36 144 37 58 54
E 79 76 39 112 95
F 105 28 27 44 58
H 49 57 106 68 149
I 15 52 31 92 122
J 18 105 64 50 119
K 146 22 48 92 107
In [155]:
df1.append(df2) # append追加,在行后面直接进行追加
Out[155]:
Python Math En
A 86 63 16
B 17 148 13
C 67 47 32
D 36 144 37
E 79 76 39
F 105 28 27
H 49 57 106
I 15 52 31
J 18 105 64
K 146 22 48
Q 27 134 80
W 78 73 98
R 150 119 28
T 23 44 79
U 54 86 141
Y 145 27 81
O 75 33 40
P 121 91 85
L 147 50 111
M 42 144 18
In [156]:
df1.append(df3) # 出现空数据,原因在于:df1的列索引和df3列索引不一致
/usr/local/lib64/python3.6/site-packages/pandas/core/frame.py:6692: FutureWarning: Sorting because non-concatenation axis is not aligned. A future version
of pandas will change to not sort by default.

To accept the future behavior, pass 'sort=False'.

To retain the current behavior and silence the warning, pass 'sort=True'.

  sort=sort)
Out[156]:
Chinese En Java Math Python
A NaN 16.0 NaN 63.0 86.0
B NaN 13.0 NaN 148.0 17.0
C NaN 32.0 NaN 47.0 67.0
D NaN 37.0 NaN 144.0 36.0
E NaN 39.0 NaN 76.0 79.0
F NaN 27.0 NaN 28.0 105.0
H NaN 106.0 NaN 57.0 49.0
I NaN 31.0 NaN 52.0 15.0
J NaN 64.0 NaN 105.0 18.0
K NaN 48.0 NaN 22.0 146.0
A 149.0 NaN 56.0 NaN NaN
B 140.0 NaN 76.0 NaN NaN
C 10.0 NaN 128.0 NaN NaN
D 54.0 NaN 58.0 NaN NaN
E 95.0 NaN 112.0 NaN NaN
F 58.0 NaN 44.0 NaN NaN
H 149.0 NaN 68.0 NaN NaN
I 122.0 NaN 92.0 NaN NaN
J 119.0 NaN 50.0 NaN NaN
K 107.0 NaN 92.0 NaN NaN
In [157]:
pd.concat([df1,df3],axis = 0)
/usr/local/lib/python3.6/site-packages/ipykernel_launcher.py:1: FutureWarning: Sorting because non-concatenation axis is not aligned. A future version
of pandas will change to not sort by default.

To accept the future behavior, pass 'sort=False'.

To retain the current behavior and silence the warning, pass 'sort=True'.

  """Entry point for launching an IPython kernel.
Out[157]:
Chinese En Java Math Python
A NaN 16.0 NaN 63.0 86.0
B NaN 13.0 NaN 148.0 17.0
C NaN 32.0 NaN 47.0 67.0
D NaN 37.0 NaN 144.0 36.0
E NaN 39.0 NaN 76.0 79.0
F NaN 27.0 NaN 28.0 105.0
H NaN 106.0 NaN 57.0 49.0
I NaN 31.0 NaN 52.0 15.0
J NaN 64.0 NaN 105.0 18.0
K NaN 48.0 NaN 22.0 146.0
A 149.0 NaN 56.0 NaN NaN
B 140.0 NaN 76.0 NaN NaN
C 10.0 NaN 128.0 NaN NaN
D 54.0 NaN 58.0 NaN NaN
E 95.0 NaN 112.0 NaN NaN
F 58.0 NaN 44.0 NaN NaN
H 149.0 NaN 68.0 NaN NaN
I 122.0 NaN 92.0 NaN NaN
J 119.0 NaN 50.0 NaN NaN
K 107.0 NaN 92.0 NaN NaN

数据插入¶

In [158]:
df1
Out[158]:
Python Math En
A 86 63 16
B 17 148 13
C 67 47 32
D 36 144 37
E 79 76 39
F 105 28 27
H 49 57 106
I 15 52 31
J 18 105 64
K 146 22 48
In [159]:
df1.insert(loc = 1, # 插入位置
           column='C++', # 插入一列,这一列名字
           value = np.random.randint(0,151,size = 10)) # 插入的值
In [160]:
df1
Out[160]:
Python C++ Math En
A 86 88 63 16
B 17 3 148 13
C 67 127 47 32
D 36 77 144 37
E 79 143 76 39
F 105 69 28 27
H 49 97 57 106
I 15 126 52 31
J 18 124 105 64
K 146 60 22 48

Join SQL风格合并¶

In [161]:
df1 = pd.DataFrame(data = {'name':['softpo','Brandon','Ella','Daniel','张三'],
                           'height':[175,180,169,177,168]}) # 身高
df2 = pd.DataFrame(data = {'name':['softpo','Brandon','Ella','Daniel','李四'],
                           'weight':[70,65,74,63,88]}) # 体重
df3 = pd.DataFrame(data = {'名字':['softpo','Brandon','Ella','Daniel','张三'],
                           'salary':np.random.randint(20,100,size = 5)}) # 薪水
display(df1,df2,df3)
name height
0 softpo 175
1 Brandon 180
2 Ella 169
3 Daniel 177
4 张三 168
name weight
0 softpo 70
1 Brandon 65
2 Ella 74
3 Daniel 63
4 李四 88
名字 salary
0 softpo 79
1 Brandon 74
2 Ella 81
3 Daniel 24
4 张三 43
In [162]:
pd.concat([df1,df2],axis = 1)
Out[162]:
name height name weight
0 softpo 175 softpo 70
1 Brandon 180 Brandon 65
2 Ella 169 Ella 74
3 Daniel 177 Daniel 63
4 张三 168 李四 88
In [163]:
# 根据共同的属性,合并数据
# df1 和 df2 共同属性:name
# 数据库,合并join 共同key
# inner内合并
pd.merge(df1,df2,how = 'inner') # 根据共同name进行合并,两表合并,外键
Out[163]:
name height weight
0 softpo 175 70
1 Brandon 180 65
2 Ella 169 74
3 Daniel 177 63
In [164]:
pd.merge(df1,df2,how = 'outer') # 外合并,所有数据保留,不对应位置,填充了空数据
Out[164]:
name height weight
0 softpo 175.0 70.0
1 Brandon 180.0 65.0
2 Ella 169.0 74.0
3 Daniel 177.0 63.0
4 张三 168.0 NaN
5 李四 NaN 88.0
In [165]:
pd.merge(df1,df2,how = 'left')
Out[165]:
name height weight
0 softpo 175 70.0
1 Brandon 180 65.0
2 Ella 169 74.0
3 Daniel 177 63.0
4 张三 168 NaN
In [166]:
pd.merge(df1,df3,left_on='name',right_on='名字')
Out[166]:
name height 名字 salary
0 softpo 175 softpo 79
1 Brandon 180 Brandon 74
2 Ella 169 Ella 81
3 Daniel 177 Daniel 24
4 张三 168 张三 43
In [167]:
df4 = pd.DataFrame(data = np.random.randint(0,151,size = (10,3)),
                   columns=['Python','Math','En'],index = list('ABCDEFHIJK'))
df4
Out[167]:
Python Math En
A 109 55 57
B 83 105 86
C 44 95 97
D 52 61 52
E 64 89 74
F 36 63 19
H 41 36 8
I 78 138 53
J 139 114 73
K 121 23 2
In [168]:
score_mean = df4.mean(axis = 1).round(1)
score_mean
Out[168]:
A     73.7
B     91.3
C     78.7
D     55.0
E     75.7
F     39.3
H     28.3
I     89.7
J    108.7
K     48.7
dtype: float64
In [169]:
df4.insert(loc = 2,column='平均分',value=score_mean)
In [170]:
df4
Out[170]:
Python Math 平均分 En
A 109 55 73.7 57
B 83 105 91.3 86
C 44 95 78.7 97
D 52 61 55.0 52
E 64 89 75.7 74
F 36 63 39.3 19
H 41 36 28.3 8
I 78 138 89.7 53
J 139 114 108.7 73
K 121 23 48.7 2
In [171]:
df5 = df4.iloc[:,[0,1,3]]
df5
Out[171]:
Python Math En
A 109 55 57
B 83 105 86
C 44 95 97
D 52 61 52
E 64 89 74
F 36 63 19
H 41 36 8
I 78 138 53
J 139 114 73
K 121 23 2
In [172]:
score_mean.name = '平均分'
score_mean
Out[172]:
A     73.7
B     91.3
C     78.7
D     55.0
E     75.7
F     39.3
H     28.3
I     89.7
J    108.7
K     48.7
Name: 平均分, dtype: float64
In [173]:
df5
Out[173]:
Python Math En
A 109 55 57
B 83 105 86
C 44 95 97
D 52 61 52
E 64 89 74
F 36 63 19
H 41 36 8
I 78 138 53
J 139 114 73
K 121 23 2
In [174]:
pd.merge(df5,score_mean,
         left_index=True, # 数据合并根据行索引,对应
         right_index=True) # 右边数据根据行索引,对应
Out[174]:
Python Math En 平均分
A 109 55 57 73.7
B 83 105 86 91.3
C 44 95 97 78.7
D 52 61 52 55.0
E 64 89 74 75.7
F 36 63 19 39.3
H 41 36 8 28.3
I 78 138 53 89.7
J 139 114 73 108.7
K 121 23 2 48.7

数据清洗¶

In [175]:
df = pd.DataFrame(data = {'color':['red','blue','red','green','green','blue',None,np.NaN,'green'],
                          'price':[20,15,20,18,18,22,30,30,22]})
df
Out[175]:
color price
0 red 20
1 blue 15
2 red 20
3 green 18
4 green 18
5 blue 22
6 None 30
7 NaN 30
8 green 22
In [176]:
# 重复数据删除
df.drop_duplicates() # 非重复数据,索引7和索引6重复数据,None和NaN一回事
Out[176]:
color price
0 red 20
1 blue 15
3 green 18
5 blue 22
6 None 30
8 green 22
In [177]:
df
Out[177]:
color price
0 red 20
1 blue 15
2 red 20
3 green 18
4 green 18
5 blue 22
6 None 30
7 NaN 30
8 green 22
In [178]:
df.dropna() # 空数据过滤
Out[178]:
color price
0 red 20
1 blue 15
2 red 20
3 green 18
4 green 18
5 blue 22
8 green 22
In [179]:
# 删除行,或者列
df.drop(labels=[2,4,6,8]) # 默认情况下删除行
Out[179]:
color price
0 red 20
1 blue 15
3 green 18
5 blue 22
7 NaN 30
In [180]:
# 删除指定的列
df.drop(labels='color',axis = 1) # 删除列,axis = 1
Out[180]:
price
0 20
1 15
2 20
3 18
4 18
5 22
6 30
7 30
8 22
In [181]:
df.filter(items=['price']) # 参数意思,保留数据price
Out[181]:
price
0 20
1 15
2 20
3 18
4 18
5 22
6 30
7 30
8 22
In [182]:
df['size'] = 1024 # 广播
df
Out[182]:
color price size
0 red 20 1024
1 blue 15 1024
2 red 20 1024
3 green 18 1024
4 green 18 1024
5 blue 22 1024
6 None 30 1024
7 NaN 30 1024
8 green 22 1024
In [183]:
df.filter(like = 'i') # 模糊匹配,保留了带有i这个字母的索引
Out[183]:
price size
0 20 1024
1 15 1024
2 20 1024
3 18 1024
4 18 1024
5 22 1024
6 30 1024
7 30 1024
8 22 1024
In [184]:
df['hello'] = 512
df
Out[184]:
color price size hello
0 red 20 1024 512
1 blue 15 1024 512
2 red 20 1024 512
3 green 18 1024 512
4 green 18 1024 512
5 blue 22 1024 512
6 None 30 1024 512
7 NaN 30 1024 512
8 green 22 1024 512
In [185]:
# 正则表达式,方式很多
df.filter(regex = 'e$') # 正则表达式,正则表达式,限制e必须在最后
Out[185]:
price size
0 20 1024
1 15 1024
2 20 1024
3 18 1024
4 18 1024
5 22 1024
6 30 1024
7 30 1024
8 22 1024
In [186]:
df.filter(regex='e') # 只要带有e全部选出来
Out[186]:
price size hello
0 20 1024 512
1 15 1024 512
2 20 1024 512
3 18 1024 512
4 18 1024 512
5 22 1024 512
6 30 1024 512
7 30 1024 512
8 22 1024 512
In [187]:
# 异常值过滤
a = np.random.randint(0,1000,size = 200)
a
Out[187]:
array([643, 267, 800, 955, 478, 343,  27, 915, 853, 150, 970, 927, 821,
       159, 383, 713, 496, 858, 194, 170, 913, 218, 752, 776, 603, 103,
       864, 132, 352,  72, 297, 532, 563, 238, 666,  87, 955, 887,  58,
       713,  76, 987, 754, 901, 350, 144, 747, 544, 601, 556, 839, 280,
       778, 564, 642, 152, 968, 161, 720, 961, 728, 867, 455, 924, 927,
        93, 116, 417, 250,  13, 983, 449, 886,  68, 424, 157, 358, 762,
       101, 277, 197, 706, 980, 688, 895, 788, 829, 777, 926, 831, 128,
        40, 596, 577, 619, 128, 639, 267, 883, 311, 877, 931, 985, 465,
       283, 381, 832, 389, 381, 221, 731, 191, 550, 805, 788, 195, 123,
       432, 910, 442, 793, 105, 565, 373, 176,  18, 938, 696, 127, 586,
       904, 426, 148, 788, 532, 985, 451, 225, 308, 439, 594, 135, 961,
       238, 388, 479,   5, 834, 320, 260, 431, 658, 128, 242, 876, 201,
       584, 106,  29, 261, 606, 660, 645, 681, 151, 101, 810, 831, 118,
       220, 263, 896, 893, 176, 186, 459, 197, 935, 238, 684, 800, 319,
       470, 951, 628, 146, 501, 417, 729, 289, 756, 523, 727, 212, 206,
       576,   0, 606, 120, 911])
In [188]:
# 异常值,大于800,小于 100算作异常,认为定义的。根据实际情况。
cond = (a <=800) & (a >=100)
a[cond]
Out[188]:
array([643, 267, 800, 478, 343, 150, 159, 383, 713, 496, 194, 170, 218,
       752, 776, 603, 103, 132, 352, 297, 532, 563, 238, 666, 713, 754,
       350, 144, 747, 544, 601, 556, 280, 778, 564, 642, 152, 161, 720,
       728, 455, 116, 417, 250, 449, 424, 157, 358, 762, 101, 277, 197,
       706, 688, 788, 777, 128, 596, 577, 619, 128, 639, 267, 311, 465,
       283, 381, 389, 381, 221, 731, 191, 550, 788, 195, 123, 432, 442,
       793, 105, 565, 373, 176, 696, 127, 586, 426, 148, 788, 532, 451,
       225, 308, 439, 594, 135, 238, 388, 479, 320, 260, 431, 658, 128,
       242, 201, 584, 106, 261, 606, 660, 645, 681, 151, 101, 118, 220,
       263, 176, 186, 459, 197, 238, 684, 800, 319, 470, 628, 146, 501,
       417, 729, 289, 756, 523, 727, 212, 206, 576, 606, 120])
In [189]:
# 正态分布,平均值是0,标准差是1
b = np.random.randn(100000)
b
Out[189]:
array([0.06185263, 0.6889631 , 0.59866085, ..., 0.16746448, 0.72527186,
       0.31254871])

$$3\sigma$$过滤异常值

In [190]:
cond = np.abs(b) > 3*1 # 这些异常值,找到了
b[cond]
Out[190]:
array([ 3.12531267,  3.53646109,  3.35870789,  3.00908812,  3.08555791,
        3.69282921, -3.11199196, -3.10141803,  3.17150465, -3.09715731,
       -3.12139927, -3.6644674 ,  3.12831913,  3.33899332,  3.28012171,
       -3.01593631, -3.00472327, -3.34713946,  3.03726558,  3.09043764,
        3.59441916, -3.46771421, -3.41098038,  3.27398198,  3.04794016,
       -3.03393297, -3.36986485, -3.0471034 ,  4.11257257, -3.15714535,
       -3.075014  , -3.3047033 , -3.09636727,  3.43393017, -3.63698557,
        3.17074287, -3.90974506, -3.13501366, -3.13992119, -3.12071336,
       -3.20075666,  3.10485782, -3.14027985,  3.15899101,  3.17209853,
       -3.03054533,  3.09188015,  3.21495512,  3.15233857, -4.1074173 ,
        3.2253492 , -3.19823277,  3.33558762,  3.06300821,  3.21361971,
        3.01801299, -3.24916605,  3.20517414,  3.17786085,  3.13516386,
       -3.65085121, -3.84871057,  3.09963254,  3.57481093,  3.45043744,
       -3.15906377, -3.38920118,  3.05203114,  3.00012428, -3.1025302 ,
       -3.83417958, -3.5775724 , -3.03511149, -3.22842423, -3.84394928,
        3.03823692,  3.39441859, -3.24265019, -3.30867117, -3.67369735,
        3.01062668,  3.11299814, -3.24401327,  3.79765117, -3.30270877,
       -3.2800196 , -3.01453456,  3.68147711,  3.10867544,  3.68972147,
       -3.53246181,  3.16313505,  4.23151258,  3.09599934, -3.29737416,
       -3.08634055,  3.18312106, -3.18935816,  3.29057975, -3.20553999,
       -3.33209751,  3.04545462, -3.35367437, -3.20768287, -3.21861656,
        3.36849631,  3.57664772, -3.59101046,  3.16189938, -3.79248725,
       -3.29649689, -3.66325428, -3.23941526,  3.02881266,  3.13204553,
        3.15757296,  3.13623107, -3.44198856,  3.07676934,  3.50441481,
       -3.21333369, -3.37828021, -3.0375037 , -3.57041166, -3.12464144,
        3.03916245,  3.04069449,  3.19386406,  3.19142543,  3.85516255,
        3.03282696,  3.45448351, -3.3078677 ,  3.46351849,  3.19786143,
        3.03152481,  3.43446812, -3.31054193,  3.21088165,  3.36840489,
       -3.38044849, -3.00921442,  3.1219749 ,  3.15933805, -3.41993644,
       -3.4097775 , -3.38593189, -4.18798358,  3.40138851,  3.0113701 ,
        3.01740653, -3.40500013, -3.05878055, -3.07548277, -3.29630402,
       -3.500132  , -3.24234859, -4.05282385,  3.08325821,  3.00763323,
       -3.03459162,  3.31004967, -3.01794892,  3.59330034, -3.09791303,
        3.15578549, -3.33513053, -3.05922964,  3.31026577, -3.09499574,
        3.03731423, -3.40054824, -3.70049956, -3.0523669 , -3.10856291,
       -3.25793825, -3.04414981,  3.19442291, -3.088949  ,  3.17168375,
        3.30227073, -3.38771402, -3.12829636,  3.16628376, -3.30355238,
        3.01475522,  3.12405473, -3.66410007, -3.12327755,  3.24688456,
       -3.800521  ,  3.24900921, -3.16853748,  3.01274442,  3.14716756,
       -3.04733754,  3.80125874,  3.56487198,  3.48118804,  3.37307173,
       -3.0147674 ,  3.02763541,  3.07462613,  3.79824528,  3.35446618,
       -3.03658518, -3.0453061 , -3.14411675, -3.08370988, -3.19209386,
       -3.17431304,  3.62251441, -3.19171963,  3.06666652,  3.00632902,
        3.2472361 , -3.01493052, -3.08404567,  3.13739076, -3.29959623,
        3.64119174,  3.64327038,  3.0344191 , -3.03413043, -3.59906937,
        3.0875687 , -3.94105558, -3.10760891,  3.10310789,  3.42138677,
        3.72504828, -3.54701095,  3.33917118, -3.35961448, -3.84669026,
       -3.3116611 ,  3.09058769,  4.42893521,  3.0972846 ,  3.35258875,
       -3.7856169 ,  3.17070215,  3.29838751,  3.51534356,  3.37750893,
        3.95005345,  3.08191128,  3.58466884, -3.47805446, -3.16077455,
       -3.3657609 ,  3.20392432, -3.76055486, -3.01011825, -3.31458145,
       -3.63892119,  3.3493323 , -3.44041607, -3.05540987,  3.32262132,
        3.20841561, -3.41013493, -3.10675183, -3.44613379, -3.17370254,
        3.40219193,  3.10009815, -3.04576336, -3.03243022, -3.23138887,
       -3.19074572, -3.07378805, -3.19173664,  3.18543431])

数据转换¶

轴和元素转换¶

In [191]:
import numpy as np
import pandas as pd
In [192]:
df = pd.DataFrame(data = np.random.randint(0,10,size = (10,3)),
                  columns=['Python','Tensorflow','Keras'],
                  index = list('ABCDEFHIJK'))
df
Out[192]:
Python Tensorflow Keras
A 2 1 8
B 4 4 0
C 9 5 3
D 2 3 4
E 7 9 0
F 0 8 3
H 5 3 4
I 1 6 6
J 9 1 9
K 6 9 3
In [193]:
df.rename(index = {'A':'X','K':'Y'}, # 行索引
          columns={'Python':'人工智能'}, # 列索引修改
          inplace=True) # 替换原数据
In [194]:
df.replace(5,50,inplace=True)
df
Out[194]:
人工智能 Tensorflow Keras
X 2 1 8
B 4 4 0
C 9 50 3
D 2 3 4
E 7 9 0
F 0 8 3
H 50 3 4
I 1 6 6
J 9 1 9
Y 6 9 3
In [195]:
df.replace([2,7],1024,inplace=True)
df
Out[195]:
人工智能 Tensorflow Keras
X 1024 1 8
B 4 4 0
C 9 50 3
D 1024 3 4
E 1024 9 0
F 0 8 3
H 50 3 4
I 1 6 6
J 9 1 9
Y 6 9 3
In [196]:
df.iloc[4,2] = np.NaN # 空数据
In [197]:
df.replace({0:2048,np.nan:-100},inplace=True)
df
Out[197]:
人工智能 Tensorflow Keras
X 1024 1 8.0
B 4 4 2048.0
C 9 50 3.0
D 1024 3 4.0
E 1024 9 -100.0
F 2048 8 3.0
H 50 3 4.0
I 1 6 6.0
J 9 1 9.0
Y 6 9 3.0
In [198]:
df.replace({'Tensorflow':1024},-1024) # 指定某一列,进行数据替换
Out[198]:
人工智能 Tensorflow Keras
X 1024 1 8.0
B 4 4 2048.0
C 9 50 3.0
D 1024 3 4.0
E 1024 9 -100.0
F 2048 8 3.0
H 50 3 4.0
I 1 6 6.0
J 9 1 9.0
Y 6 9 3.0

map映射元素转变¶

In [199]:
# map 只能针对一列,就是Series
# 有一些没有对应,那么返回就是空数据
df['人工智能'].map({1024:3.14,2048:2.718,6:1108}) # 跟据字典对数据进行改变
Out[199]:
X       3.140
B         NaN
C         NaN
D       3.140
E       3.140
F       2.718
H         NaN
I         NaN
J         NaN
Y    1108.000
Name: 人工智能, dtype: float64
In [200]:
df['Keras'].map(lambda x :True if x > 0 else False) # 如果大于 0 返回True,不然返回False
Out[200]:
X     True
B     True
C     True
D     True
E    False
F     True
H     True
I     True
J     True
Y     True
Name: Keras, dtype: bool
In [201]:
def convert(x):
    if x >= 1024:
        return True
    else:
        return False
df['level'] = df['Tensorflow'].map(convert) # map映射,映射是Tensorflow中这一列中每一个数据,传递到方法中
df
Out[201]:
人工智能 Tensorflow Keras level
X 1024 1 8.0 False
B 4 4 2048.0 False
C 9 50 3.0 False
D 1024 3 4.0 False
E 1024 9 -100.0 False
F 2048 8 3.0 False
H 50 3 4.0 False
I 1 6 6.0 False
J 9 1 9.0 False
Y 6 9 3.0 False

apply映射元素转变¶

In [202]:
# 既可以操作Series又可以操作DataFrame
df['人工智能'].apply(lambda x : x + 100)
Out[202]:
X    1124
B     104
C     109
D    1124
E    1124
F    2148
H     150
I     101
J     109
Y     106
Name: 人工智能, dtype: int64
In [203]:
df['level'].apply(lambda x:1 if x else 0)
Out[203]:
X    0
B    0
C    0
D    0
E    0
F    0
H    0
I    0
J    0
Y    0
Name: level, dtype: int64
In [204]:
df.apply(lambda x : x + 1000) # apply对 所有的数据进行映射
Out[204]:
人工智能 Tensorflow Keras level
X 2024 1001 1008.0 1000
B 1004 1004 3048.0 1000
C 1009 1050 1003.0 1000
D 2024 1003 1004.0 1000
E 2024 1009 900.0 1000
F 3048 1008 1003.0 1000
H 1050 1003 1004.0 1000
I 1001 1006 1006.0 1000
J 1009 1001 1009.0 1000
Y 1006 1009 1003.0 1000
In [207]:
def convert(x):
    return (x.median(),x.count(),x.min(),x.max(),x.std()) # 返回中位数,返回的是计数
df.apply().round(1) # 默认操作列数据convert
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-207-e3e0db38272b> in <module>
      1 def convert(x):
      2     return (x.median(),x.count(),x.min(),x.max(),x.std()) # 返回中位数,返回的是计数
----> 3 df.apply().round(1) # 默认操作列数据convert

TypeError: apply() missing 1 required positional argument: 'func'
In [208]:
df
Out[208]:
人工智能 Tensorflow Keras level
X 1024 1 8.0 False
B 4 4 2048.0 False
C 9 50 3.0 False
D 1024 3 4.0 False
E 1024 9 -100.0 False
F 2048 8 3.0 False
H 50 3 4.0 False
I 1 6 6.0 False
J 9 1 9.0 False
Y 6 9 3.0 False
In [209]:
df.apply(convert,axis = 1) # axis = 1,操作数据就是行数据
Out[209]:
X       (4.5, 4, False, 1024, 510.5124059870305)
B    (4.0, 4, False, 2048.0, 1022.6684050398089)
C        (6.0, 4, False, 50, 23.302360395462088)
D      (3.5, 4, False, 1024, 510.83616094921604)
E      (4.5, 4, -100.0, 1024, 529.4760775206626)
F      (5.5, 4, False, 2048, 1022.1719930292228)
H         (3.5, 4, False, 50, 23.89386253134195)
I         (3.5, 4, False, 6, 3.2015621187164243)
J          (5.0, 4, False, 9, 4.924428900898052)
Y          (4.5, 4, False, 9, 3.872983346207417)
dtype: object

transform元素转变¶

In [210]:
df = pd.DataFrame(np.random.randint(0,10,size = (10,3)),
                  columns=['Python','Tensorflow','Keras'],
                  index = list('ABCDEFHIJK'))
display(df)
# 可以针对一列数据,Series进行运算
df['Python'].transform(lambda x : 1024 if x > 5 else -1024) # 这个功能和map,apply类似的
Python Tensorflow Keras
A 8 7 2
B 1 0 2
C 1 4 0
D 8 9 3
E 6 6 7
F 3 8 1
H 8 2 5
I 6 0 7
J 1 3 7
K 2 6 9
Out[210]:
A    1024
B   -1024
C   -1024
D    1024
E    1024
F   -1024
H    1024
I    1024
J   -1024
K   -1024
Name: Python, dtype: int64
In [211]:
df['Tensorflow'].apply([np.sqrt,np.square,np.cumsum]) # 针对一列,进行不同的操作
Out[211]:
sqrt square cumsum
A 2.645751 49 7
B 0.000000 0 7
C 2.000000 16 11
D 3.000000 81 20
E 2.449490 36 26
F 2.828427 64 34
H 1.414214 4 36
I 0.000000 0 36
J 1.732051 9 39
K 2.449490 36 45
In [212]:
df['Tensorflow'].transform([np.sqrt,np.square,np.cumsum]) # 针对一列,进行不同的操作
Out[212]:
sqrt square cumsum
A 2.645751 49 7
B 0.000000 0 7
C 2.000000 16 11
D 3.000000 81 20
E 2.449490 36 26
F 2.828427 64 34
H 1.414214 4 36
I 0.000000 0 36
J 1.732051 9 39
K 2.449490 36 45
In [213]:
def convert(x):
    if x > 5:
        return True
    else:
        return False
# 可以针对DataFrame进行运算
df.transform({'Python':np.cumsum,'Tensorflow':np.square,'Keras':convert}) # 对不同的列,执行不同的操作
Out[213]:
Python Tensorflow Keras
A 8 49 False
B 9 0 False
C 10 16 False
D 18 81 False
E 24 36 True
F 27 64 False
H 35 4 False
I 41 0 True
J 42 9 True
K 44 36 True
In [214]:
df.apply({'Python':np.cumsum,'Tensorflow':np.square,'Keras':convert}) # 对不同的列,执行不同的操作
Out[214]:
Python Tensorflow Keras
A 8 49 False
B 9 0 False
C 10 16 False
D 18 81 False
E 24 36 True
F 27 64 False
H 35 4 False
I 41 0 True
J 42 9 True
K 44 36 True

重排随机抽样哑变量¶

In [215]:
df
Out[215]:
Python Tensorflow Keras
A 8 7 2
B 1 0 2
C 1 4 0
D 8 9 3
E 6 6 7
F 3 8 1
H 8 2 5
I 6 0 7
J 1 3 7
K 2 6 9
In [216]:
index = np.random.permutation(10) # 返回打乱顺讯的索引
index
Out[216]:
array([9, 4, 2, 0, 7, 5, 3, 6, 1, 8])
In [217]:
# 重排,索引打乱
df.take(index)
Out[217]:
Python Tensorflow Keras
K 2 6 9
E 6 6 7
C 1 4 0
A 8 7 2
I 6 0 7
F 3 8 1
D 8 9 3
H 8 2 5
B 1 0 2
J 1 3 7
In [218]:
# 从大量数据中随机抽取数据
df.take(np.random.randint(0,10,size = 20)) # 随机抽样20个数据
Out[218]:
Python Tensorflow Keras
F 3 8 1
K 2 6 9
J 1 3 7
H 8 2 5
D 8 9 3
I 6 0 7
A 8 7 2
J 1 3 7
I 6 0 7
F 3 8 1
K 2 6 9
H 8 2 5
C 1 4 0
J 1 3 7
H 8 2 5
F 3 8 1
C 1 4 0
A 8 7 2
C 1 4 0
I 6 0 7
In [219]:
df2 = pd.DataFrame(data = {'key':['a','b','a','b','c','b','c']})
df2
Out[219]:
key
0 a
1 b
2 a
3 b
4 c
5 b
6 c
In [220]:
# one-hot,哑变量
# str类型数据,经过哑变量变换可以使用数字表示
pd.get_dummies(df2,prefix='',prefix_sep='') # 1表示,有;0表示,没有
Out[220]:
a b c
0 1 0 0
1 0 1 0
2 1 0 0
3 0 1 0
4 0 0 1
5 0 1 0
6 0 0 1

数据重塑¶

In [221]:
df
Out[221]:
Python Tensorflow Keras
A 8 7 2
B 1 0 2
C 1 4 0
D 8 9 3
E 6 6 7
F 3 8 1
H 8 2 5
I 6 0 7
J 1 3 7
K 2 6 9
In [222]:
df.T # 转置,行变列,列变行
Out[222]:
A B C D E F H I J K
Python 8 1 1 8 6 3 8 6 1 2
Tensorflow 7 0 4 9 6 8 2 0 3 6
Keras 2 2 0 3 7 1 5 7 7 9
In [223]:
df2 = pd.DataFrame(np.random.randint(0,10,size = (20,3)),
                   columns=['Python','Math','En'],
                   index = pd.MultiIndex.from_product([list('ABCDEFHIJK'),['期中','期末']])) # 多层索引

df2
Out[223]:
Python Math En
A 期中 0 4 4
期末 8 6 3
B 期中 5 2 0
期末 2 3 8
C 期中 9 4 1
期末 2 2 4
D 期中 8 4 5
期末 1 9 6
E 期中 9 0 5
期末 1 4 9
F 期中 7 6 9
期末 0 2 2
H 期中 1 5 1
期末 2 1 2
I 期中 1 7 8
期末 9 3 3
J 期中 2 6 4
期末 4 2 9
K 期中 6 2 9
期末 0 6 6
In [224]:
df2.unstack(level = 1) # 将行索引变成列索引,-1表示最后一层
Out[224]:
Python Math En
期中 期末 期中 期末 期中 期末
A 0 8 4 6 4 3
B 5 2 2 3 0 8
C 9 2 4 2 1 4
D 8 1 4 9 5 6
E 9 1 0 4 5 9
F 7 0 6 2 9 2
H 1 2 5 1 1 2
I 1 9 7 3 8 3
J 2 4 6 2 4 9
K 6 0 2 6 9 6
In [225]:
df2.unstack(level = -1) # 将行索引变成列索引,-1表示最后一层
Out[225]:
Python Math En
期中 期末 期中 期末 期中 期末
A 0 8 4 6 4 3
B 5 2 2 3 0 8
C 9 2 4 2 1 4
D 8 1 4 9 5 6
E 9 1 0 4 5 9
F 7 0 6 2 9 2
H 1 2 5 1 1 2
I 1 9 7 3 8 3
J 2 4 6 2 4 9
K 6 0 2 6 9 6
In [226]:
df2.stack() # 列变成行了
Out[226]:
A  期中  Python    0
       Math      4
       En        4
   期末  Python    8
       Math      6
       En        3
B  期中  Python    5
       Math      2
       En        0
   期末  Python    2
       Math      3
       En        8
C  期中  Python    9
       Math      4
       En        1
   期末  Python    2
       Math      2
       En        4
D  期中  Python    8
       Math      4
       En        5
   期末  Python    1
       Math      9
       En        6
E  期中  Python    9
       Math      0
       En        5
   期末  Python    1
       Math      4
       En        9
F  期中  Python    7
       Math      6
       En        9
   期末  Python    0
       Math      2
       En        2
H  期中  Python    1
       Math      5
       En        1
   期末  Python    2
       Math      1
       En        2
I  期中  Python    1
       Math      7
       En        8
   期末  Python    9
       Math      3
       En        3
J  期中  Python    2
       Math      6
       En        4
   期末  Python    4
       Math      2
       En        9
K  期中  Python    6
       Math      2
       En        9
   期末  Python    0
       Math      6
       En        6
dtype: int64
In [227]:
df2.unstack().stack(level = 0)
Out[227]:
期中 期末
A En 4 3
Math 4 6
Python 0 8
B En 0 8
Math 2 3
Python 5 2
C En 1 4
Math 4 2
Python 9 2
D En 5 6
Math 4 9
Python 8 1
E En 5 9
Math 0 4
Python 9 1
F En 9 2
Math 6 2
Python 7 0
H En 1 2
Math 5 1
Python 1 2
I En 8 3
Math 7 3
Python 1 9
J En 4 9
Math 6 2
Python 2 4
K En 9 6
Math 2 6
Python 6 0
In [228]:
df2.mean() # 计算的是 列
Out[228]:
Python    3.85
Math      3.90
En        4.90
dtype: float64
In [229]:
df2.mean(axis = 1)
Out[229]:
A  期中    2.666667
   期末    5.666667
B  期中    2.333333
   期末    4.333333
C  期中    4.666667
   期末    2.666667
D  期中    5.666667
   期末    5.333333
E  期中    4.666667
   期末    4.666667
F  期中    7.333333
   期末    1.333333
H  期中    2.333333
   期末    1.666667
I  期中    5.333333
   期末    5.000000
J  期中    4.000000
   期末    5.000000
K  期中    5.666667
   期末    4.000000
dtype: float64
In [230]:
df2.mean(level=1) # 计算期中期末所有学生的平均分
Out[230]:
Python Math En
期中 4.8 4.0 4.6
期末 2.9 3.8 5.2
In [231]:
df2.mean(level = 0) # 计算每位学生期中和期末平均分
Out[231]:
Python Math En
A 4.0 5.0 3.5
B 3.5 2.5 4.0
C 5.5 3.0 2.5
D 4.5 6.5 5.5
E 5.0 2.0 7.0
F 3.5 4.0 5.5
H 1.5 3.0 1.5
I 5.0 5.0 5.5
J 3.0 4.0 6.5
K 3.0 4.0 7.5

数学和统计方法¶

简单统计指标¶

In [232]:
df = pd.DataFrame(np.random.randint(0,10,size = (20,3)),
                  columns=['Python','Math','En'],index = list('QWERTYUIOPASDFGHJKLZ'))
df
Out[232]:
Python Math En
Q 1 4 4
W 0 7 9
E 1 2 2
R 5 8 1
T 8 3 0
Y 0 1 5
U 1 4 4
I 8 6 5
O 5 3 1
P 7 8 2
A 4 9 1
S 1 2 7
D 0 2 5
F 5 3 9
G 9 0 9
H 5 9 9
J 0 1 1
K 4 9 2
L 2 4 3
Z 3 2 9
In [233]:
df.iloc[6,2] = np.NAN
display(df)
Python Math En
Q 1 4 4.0
W 0 7 9.0
E 1 2 2.0
R 5 8 1.0
T 8 3 0.0
Y 0 1 5.0
U 1 4 NaN
I 8 6 5.0
O 5 3 1.0
P 7 8 2.0
A 4 9 1.0
S 1 2 7.0
D 0 2 5.0
F 5 3 9.0
G 9 0 9.0
H 5 9 9.0
J 0 1 1.0
K 4 9 2.0
L 2 4 3.0
Z 3 2 9.0
In [234]:
df.count() # 统计非空数据数量
Out[234]:
Python    20
Math      20
En        19
dtype: int64
In [235]:
display(df.mean(),df.median()) # 平均值,中位数
Python    3.450000
Math      4.350000
En        4.421053
dtype: float64
Python    3.5
Math      3.5
En        4.0
dtype: float64
In [236]:
display(df.min(),df.max()) # 最小值,最大值
Python    0.0
Math      0.0
En        0.0
dtype: float64
Python    9.0
Math      9.0
En        9.0
dtype: float64
In [237]:
df['Python'].unique() # 去除重复数据
Out[237]:
array([1, 0, 5, 8, 7, 4, 9, 2, 3])
In [238]:
df['Math'].value_counts() # 统计出现的频次
Out[238]:
2    4
9    3
4    3
3    3
8    2
1    2
7    1
6    1
0    1
Name: Math, dtype: int64
In [239]:
df.quantile(q = [0,0.25,0.5,0.75,1]) # 百分位数
Out[239]:
Python Math En
0.00 0.0 0.00 0.0
0.25 1.0 2.00 1.5
0.50 3.5 3.50 4.0
0.75 5.0 7.25 8.0
1.00 9.0 9.00 9.0
In [240]:
df.describe().round(1)
Out[240]:
Python Math En
count 20.0 20.0 19.0
mean 3.4 4.4 4.4
std 3.0 3.0 3.3
min 0.0 0.0 0.0
25% 1.0 2.0 1.5
50% 3.5 3.5 4.0
75% 5.0 7.2 8.0
max 9.0 9.0 9.0

索引标签、位置获取¶

In [241]:
df['Python'].argmax() # 返回最大值索引
/usr/local/lib/python3.6/site-packages/ipykernel_launcher.py:1: FutureWarning: 
The current behaviour of 'Series.argmax' is deprecated, use 'idxmax'
instead.
The behavior of 'argmax' will be corrected to return the positional
maximum in the future. For now, use 'series.values.argmax' or
'np.argmax(np.array(values))' to get the position of the maximum
row.
  """Entry point for launching an IPython kernel.
Out[241]:
'G'
In [37]:
df['En'].argmin() # 最小值索引
/usr/local/lib/python3.6/site-packages/ipykernel_launcher.py:1: FutureWarning: 
The current behaviour of 'Series.argmin' is deprecated, use 'idxmin'
instead.
The behavior of 'argmin' will be corrected to return the positional
minimum in the future. For now, use 'series.values.argmin' or
'np.argmin(np.array(values))' to get the position of the minimum
row.
  """Entry point for launching an IPython kernel.
Out[37]:
'R'
In [38]:
df.idxmax() # 返回最大值的标签
Out[38]:
Python    R
Math      U
En        T
dtype: object
In [242]:
df.idxmin() # 返回最小值标签
Out[242]:
Python    W
Math      G
En        T
dtype: object

更多统计指标¶

In [243]:
df.cumsum() # 累加和
Out[243]:
Python Math En
Q 1.0 4.0 4.0
W 1.0 11.0 13.0
E 2.0 13.0 15.0
R 7.0 21.0 16.0
T 15.0 24.0 16.0
Y 15.0 25.0 21.0
U 16.0 29.0 NaN
I 24.0 35.0 26.0
O 29.0 38.0 27.0
P 36.0 46.0 29.0
A 40.0 55.0 30.0
S 41.0 57.0 37.0
D 41.0 59.0 42.0
F 46.0 62.0 51.0
G 55.0 62.0 60.0
H 60.0 71.0 69.0
J 60.0 72.0 70.0
K 64.0 81.0 72.0
L 66.0 85.0 75.0
Z 69.0 87.0 84.0
In [244]:
df.cumprod() # 累乘和
Out[244]:
Python Math En
Q 1.0 4.0 4.0
W 0.0 28.0 36.0
E 0.0 56.0 72.0
R 0.0 448.0 72.0
T 0.0 1344.0 0.0
Y 0.0 1344.0 0.0
U 0.0 5376.0 NaN
I 0.0 32256.0 0.0
O 0.0 96768.0 0.0
P 0.0 774144.0 0.0
A 0.0 6967296.0 0.0
S 0.0 13934592.0 0.0
D 0.0 27869184.0 0.0
F 0.0 83607552.0 0.0
G 0.0 0.0 0.0
H 0.0 0.0 0.0
J 0.0 0.0 0.0
K 0.0 0.0 0.0
L 0.0 0.0 0.0
Z 0.0 0.0 0.0
In [245]:
df.cummin() # 累计最小值
Out[245]:
Python Math En
Q 1.0 4.0 4.0
W 0.0 4.0 4.0
E 0.0 2.0 2.0
R 0.0 2.0 1.0
T 0.0 2.0 0.0
Y 0.0 1.0 0.0
U 0.0 1.0 NaN
I 0.0 1.0 0.0
O 0.0 1.0 0.0
P 0.0 1.0 0.0
A 0.0 1.0 0.0
S 0.0 1.0 0.0
D 0.0 1.0 0.0
F 0.0 1.0 0.0
G 0.0 0.0 0.0
H 0.0 0.0 0.0
J 0.0 0.0 0.0
K 0.0 0.0 0.0
L 0.0 0.0 0.0
Z 0.0 0.0 0.0
In [246]:
df.cummax() # 累计最大值
Out[246]:
Python Math En
Q 1.0 4.0 4.0
W 1.0 7.0 9.0
E 1.0 7.0 9.0
R 5.0 8.0 9.0
T 8.0 8.0 9.0
Y 8.0 8.0 9.0
U 8.0 8.0 NaN
I 8.0 8.0 9.0
O 8.0 8.0 9.0
P 8.0 8.0 9.0
A 8.0 9.0 9.0
S 8.0 9.0 9.0
D 8.0 9.0 9.0
F 8.0 9.0 9.0
G 9.0 9.0 9.0
H 9.0 9.0 9.0
J 9.0 9.0 9.0
K 9.0 9.0 9.0
L 9.0 9.0 9.0
Z 9.0 9.0 9.0
In [247]:
df.std() # 标准差
Out[247]:
Python    2.981963
Math      2.996050
En        3.321910
dtype: float64
In [248]:
df.var()
Out[248]:
Python     8.892105
Math       8.976316
En        11.035088
dtype: float64
In [249]:
df.diff() # 差分,当前数据减去上一个的差值
Out[249]:
Python Math En
Q NaN NaN NaN
W -1.0 3.0 5.0
E 1.0 -5.0 -7.0
R 4.0 6.0 -1.0
T 3.0 -5.0 -1.0
Y -8.0 -2.0 5.0
U 1.0 3.0 NaN
I 7.0 2.0 NaN
O -3.0 -3.0 -4.0
P 2.0 5.0 1.0
A -3.0 1.0 -1.0
S -3.0 -7.0 6.0
D -1.0 0.0 -2.0
F 5.0 1.0 4.0
G 4.0 -3.0 0.0
H -4.0 9.0 0.0
J -5.0 -8.0 -8.0
K 4.0 8.0 1.0
L -2.0 -5.0 1.0
Z 1.0 -2.0 6.0
In [250]:
df.pct_change().round(3) # 计算百分比变化
Out[250]:
Python Math En
Q NaN NaN NaN
W -1.000 0.750 1.250
E inf -0.714 -0.778
R 4.000 3.000 -0.500
T 0.600 -0.625 -1.000
Y -1.000 -0.667 inf
U inf 3.000 0.000
I 7.000 0.500 0.000
O -0.375 -0.500 -0.800
P 0.400 1.667 1.000
A -0.429 0.125 -0.500
S -0.750 -0.778 6.000
D -1.000 0.000 -0.286
F inf 0.500 0.800
G 0.800 -1.000 0.000
H -0.444 inf 0.000
J -1.000 -0.889 -0.889
K inf 8.000 1.000
L -0.500 -0.556 0.500
Z 0.500 -0.500 2.000

高级统计指标¶

In [251]:
df.cov() # 协方差:自己和别人计算
Out[251]:
Python Math En
Python 8.892105 2.150000 -0.423977
Math 2.150000 8.976316 -1.774854
En -0.423977 -1.774854 11.035088
In [252]:
df.var() # 方差: 自己和自己计算
Out[252]:
Python     8.892105
Math       8.976316
En        11.035088
dtype: float64
In [253]:
df['Python'].cov(df['Math'])
Out[253]:
2.15
In [254]:
df.corr() # 相关性系数 -1 ~ 1
Out[254]:
Python Math En
Python 1.000000 0.240651 -0.042461
Math 0.240651 1.000000 -0.173640
En -0.042461 -0.173640 1.000000
In [255]:
df.corrwith(df['En']) # 一列的相关性系数
Out[255]:
Python   -0.042461
Math     -0.173640
En        1.000000
dtype: float64

排序¶

In [256]:
df = pd.DataFrame(np.random.randint(0,20,size = (20,3)),
                  columns=['Python','Tensorflow','Keras'],index = list('QWERTYUIOPASDFGHJKLZ'))
df
Out[256]:
Python Tensorflow Keras
Q 16 12 2
W 1 15 16
E 15 13 7
R 17 6 7
T 3 11 14
Y 9 6 13
U 10 10 13
I 12 3 8
O 2 2 11
P 2 9 4
A 3 14 15
S 3 17 10
D 15 19 3
F 8 12 15
G 17 11 13
H 13 12 10
J 3 0 2
K 14 18 19
L 7 13 14
Z 8 3 16
In [257]:
df.sort_index(axis = 0,ascending=False) # 降序
Out[257]:
Python Tensorflow Keras
Z 8 3 16
Y 9 6 13
W 1 15 16
U 10 10 13
T 3 11 14
S 3 17 10
R 17 6 7
Q 16 12 2
P 2 9 4
O 2 2 11
L 7 13 14
K 14 18 19
J 3 0 2
I 12 3 8
H 13 12 10
G 17 11 13
F 8 12 15
E 15 13 7
D 15 19 3
A 3 14 15
In [258]:
df.sort_index(ascending=True) # 升序
Out[258]:
Python Tensorflow Keras
A 3 14 15
D 15 19 3
E 15 13 7
F 8 12 15
G 17 11 13
H 13 12 10
I 12 3 8
J 3 0 2
K 14 18 19
L 7 13 14
O 2 2 11
P 2 9 4
Q 16 12 2
R 17 6 7
S 3 17 10
T 3 11 14
U 10 10 13
W 1 15 16
Y 9 6 13
Z 8 3 16
In [259]:
df.sort_values(by = 'Python',ascending=True) # 根据Python属性进行升序排列
Out[259]:
Python Tensorflow Keras
W 1 15 16
P 2 9 4
O 2 2 11
J 3 0 2
T 3 11 14
S 3 17 10
A 3 14 15
L 7 13 14
F 8 12 15
Z 8 3 16
Y 9 6 13
U 10 10 13
I 12 3 8
H 13 12 10
K 14 18 19
D 15 19 3
E 15 13 7
Q 16 12 2
R 17 6 7
G 17 11 13
In [260]:
df.sort_values(by = ['Python','Tensorflow'],ascending=True) 
# 先根据Python进行排序,如果相等在根据Tensorflow排序
Out[260]:
Python Tensorflow Keras
W 1 15 16
O 2 2 11
P 2 9 4
J 3 0 2
T 3 11 14
A 3 14 15
S 3 17 10
L 7 13 14
Z 8 3 16
F 8 12 15
Y 9 6 13
U 10 10 13
I 12 3 8
H 13 12 10
K 14 18 19
E 15 13 7
D 15 19 3
Q 16 12 2
R 17 6 7
G 17 11 13
In [261]:
df.nlargest(n = 5,columns='Python') # 根据Python进行排序,获取最大的5个数值
Out[261]:
Python Tensorflow Keras
R 17 6 7
G 17 11 13
Q 16 12 2
E 15 13 7
D 15 19 3
In [262]:
df.nsmallest(5,columns='Keras') # 根据Keras进行排序,获取最小的5个
Out[262]:
Python Tensorflow Keras
Q 16 12 2
J 3 0 2
D 15 19 3
P 2 9 4
E 15 13 7

分箱操作¶

In [263]:
df = pd.DataFrame(np.random.randint(0,151,size = (100,3)),
                  columns=['Python','Math','En'])
df
Out[263]:
Python Math En
0 60 42 11
1 136 13 9
2 0 128 94
3 112 129 102
4 38 64 121
5 49 147 130
6 27 17 78
7 55 7 46
8 150 31 59
9 19 116 119
10 77 122 45
11 106 21 1
12 0 103 15
13 54 122 105
14 80 9 117
15 90 109 71
16 67 126 111
17 28 66 107
18 38 3 102
19 64 122 78
20 2 8 150
21 46 23 105
22 92 110 74
23 51 89 26
24 38 43 39
25 11 104 118
26 43 114 93
27 54 118 76
28 126 99 36
29 117 52 14
... ... ... ...
70 57 40 40
71 23 108 46
72 99 103 75
73 127 74 38
74 97 130 38
75 97 1 148
76 37 72 86
77 116 136 107
78 99 91 50
79 43 85 65
80 49 85 73
81 122 105 38
82 17 82 84
83 96 70 26
84 115 31 4
85 22 143 100
86 12 52 4
87 101 114 7
88 42 30 107
89 136 130 48
90 54 22 13
91 11 145 144
92 50 25 50
93 68 144 79
94 117 27 61
95 94 143 72
96 41 109 53
97 85 61 41
98 56 139 101
99 24 50 29

100 rows × 3 columns

In [264]:
# 等宽
pd.cut(df.Python,
       bins = 4, # 等宽分成四份
       labels=['不及格','及格','中等','优秀'],
       right = True)# 区间,闭区间
Out[264]:
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    不及格
26     及格
27     及格
28     优秀
29     优秀
     ... 
70     及格
71    不及格
72     中等
73     优秀
74     中等
75     中等
76    不及格
77     优秀
78     中等
79     及格
80     及格
81     优秀
82    不及格
83     中等
84     优秀
85    不及格
86    不及格
87     中等
88     及格
89     优秀
90     及格
91    不及格
92     及格
93     及格
94     优秀
95     中等
96     及格
97     中等
98     及格
99    不及格
Name: Python, Length: 100, dtype: category
Categories (4, object): [不及格 < 及格 < 中等 < 优秀]
In [265]:
pd.cut(df.Python,
       bins = 4, # 等宽分成四份
       labels=['不及格','及格','中等','优秀'],
       right = True).value_counts()
Out[265]:
及格     30
不及格    27
中等     23
优秀     20
Name: Python, dtype: int64
In [266]:
df['等级'] = pd.cut(df.Python,
       bins = [0,30,60,90,120,150],
       labels=['极差','不及格','及格','中等','优秀'])
df
Out[266]:
Python Math En 等级
0 60 42 11 不及格
1 136 13 9 优秀
2 0 128 94 NaN
3 112 129 102 中等
4 38 64 121 不及格
5 49 147 130 不及格
6 27 17 78 极差
7 55 7 46 不及格
8 150 31 59 优秀
9 19 116 119 极差
10 77 122 45 及格
11 106 21 1 中等
12 0 103 15 NaN
13 54 122 105 不及格
14 80 9 117 及格
15 90 109 71 及格
16 67 126 111 及格
17 28 66 107 极差
18 38 3 102 不及格
19 64 122 78 及格
20 2 8 150 极差
21 46 23 105 不及格
22 92 110 74 中等
23 51 89 26 不及格
24 38 43 39 不及格
25 11 104 118 极差
26 43 114 93 不及格
27 54 118 76 不及格
28 126 99 36 优秀
29 117 52 14 中等
... ... ... ... ...
70 57 40 40 不及格
71 23 108 46 极差
72 99 103 75 中等
73 127 74 38 优秀
74 97 130 38 中等
75 97 1 148 中等
76 37 72 86 不及格
77 116 136 107 中等
78 99 91 50 中等
79 43 85 65 不及格
80 49 85 73 不及格
81 122 105 38 优秀
82 17 82 84 极差
83 96 70 26 中等
84 115 31 4 中等
85 22 143 100 极差
86 12 52 4 极差
87 101 114 7 中等
88 42 30 107 不及格
89 136 130 48 优秀
90 54 22 13 不及格
91 11 145 144 极差
92 50 25 50 不及格
93 68 144 79 及格
94 117 27 61 中等
95 94 143 72 中等
96 41 109 53 不及格
97 85 61 41 及格
98 56 139 101 不及格
99 24 50 29 极差

100 rows × 4 columns

In [267]:
# 等频
pd.qcut(df.Python,q = 4,labels=['不及格','及格','中等','优秀']).value_counts()
Out[267]:
不及格    26
优秀     25
中等     25
及格     24
Name: Python, dtype: int64

分组聚合¶

分组¶

In [268]:
pd.DataFrame(np.random.randint(0,10,size = (10,3)))
Out[268]:
0 1 2
0 5 8 4
1 1 3 1
2 3 9 4
3 0 8 7
4 4 9 0
5 6 4 2
6 7 1 3
7 8 7 9
8 2 0 1
9 4 2 0
In [269]:
df = pd.DataFrame(data = {'sex':np.random.randint(0,2,size = 300),
                          'class':np.random.randint(1,9,size = 300),
                          'Python':np.random.randint(0,151,size = 300),
                          'Math':np.random.randint(0,151,size = 300),
                          'En':np.random.randint(0,151,size = 300)})
df['sex'] = df['sex'].map({0:'男',1:'女'})
df
Out[269]:
sex class Python Math En
0 女 6 118 74 108
1 男 6 92 107 123
2 男 3 83 45 31
3 男 3 61 140 52
4 女 8 125 66 95
5 男 7 15 106 40
6 男 3 11 5 114
7 男 6 66 23 138
8 女 5 34 1 69
9 女 5 52 19 104
10 男 7 24 101 48
11 男 2 53 52 128
12 女 1 77 132 10
13 男 7 125 63 112
14 女 5 53 99 142
15 女 4 33 87 85
16 女 7 122 98 73
17 女 5 76 28 53
18 女 7 90 73 36
19 女 8 108 50 135
20 男 5 21 83 26
21 女 6 3 119 93
22 男 7 137 12 58
23 女 3 20 57 81
24 男 1 24 21 147
25 男 8 140 93 129
26 男 3 88 147 78
27 男 8 113 11 43
28 女 8 115 150 29
29 女 8 81 17 9
... ... ... ... ... ...
270 女 1 115 99 28
271 女 3 31 47 134
272 男 4 88 7 112
273 女 8 71 16 105
274 女 5 64 55 63
275 男 3 102 118 149
276 男 6 109 35 122
277 男 3 84 139 88
278 男 7 9 7 118
279 女 7 20 73 114
280 男 8 130 79 42
281 女 1 135 59 118
282 女 6 101 41 46
283 女 3 25 131 92
284 女 6 103 23 40
285 男 4 114 116 143
286 女 4 12 79 69
287 女 3 39 35 89
288 女 8 48 21 122
289 男 5 89 84 64
290 男 7 54 128 34
291 男 5 105 132 112
292 女 7 144 71 23
293 男 3 49 72 71
294 男 4 6 81 128
295 女 1 132 55 128
296 女 5 40 142 145
297 女 2 54 147 25
298 女 4 29 133 51
299 男 2 134 59 57

300 rows × 5 columns

In [270]:
# 单分组
for name,group in df.groupby(by = 'sex'): # 分两组
    print(name)
    print(group)
女
    sex  class  Python  Math   En
0     女      6     118    74  108
4     女      8     125    66   95
8     女      5      34     1   69
9     女      5      52    19  104
12    女      1      77   132   10
14    女      5      53    99  142
15    女      4      33    87   85
16    女      7     122    98   73
17    女      5      76    28   53
18    女      7      90    73   36
19    女      8     108    50  135
21    女      6       3   119   93
23    女      3      20    57   81
28    女      8     115   150   29
29    女      8      81    17    9
30    女      5      88   139   30
34    女      4      50   140   17
36    女      6      32    71  106
37    女      8      36   136  150
41    女      2      39    10   24
45    女      2      87   107   52
46    女      8      29    36   90
47    女      1      89   120    2
48    女      4      50    83   41
49    女      2     119    95   47
50    女      6      42    82   27
51    女      8     148    18  139
53    女      6     139   137  141
56    女      1       0    13   27
60    女      5      28    70  127
..   ..    ...     ...   ...  ...
248   女      8      46    99   96
249   女      6      65    25   95
250   女      1     135   120   46
252   女      7     135    10   45
253   女      6     121   125  141
257   女      5     150   101  147
258   女      1      27    71  123
259   女      4      45    86    8
260   女      3       8    73   58
263   女      3       4   125   97
265   女      4     136   118  120
268   女      3      27   132   79
269   女      5      41   145   24
270   女      1     115    99   28
271   女      3      31    47  134
273   女      8      71    16  105
274   女      5      64    55   63
279   女      7      20    73  114
281   女      1     135    59  118
282   女      6     101    41   46
283   女      3      25   131   92
284   女      6     103    23   40
286   女      4      12    79   69
287   女      3      39    35   89
288   女      8      48    21  122
292   女      7     144    71   23
295   女      1     132    55  128
296   女      5      40   142  145
297   女      2      54   147   25
298   女      4      29   133   51

[163 rows x 5 columns]
男
    sex  class  Python  Math   En
1     男      6      92   107  123
2     男      3      83    45   31
3     男      3      61   140   52
5     男      7      15   106   40
6     男      3      11     5  114
7     男      6      66    23  138
10    男      7      24   101   48
11    男      2      53    52  128
13    男      7     125    63  112
20    男      5      21    83   26
22    男      7     137    12   58
24    男      1      24    21  147
25    男      8     140    93  129
26    男      3      88   147   78
27    男      8     113    11   43
31    男      2      45    65   30
32    男      7      93     4   41
33    男      4     116    46  102
35    男      5      68   127  144
38    男      5      30   146   31
39    男      2     111   105   48
40    男      8     117    57   72
42    男      2      34   136   89
43    男      6      47    49   54
44    男      8     106    50   70
52    男      6      23    14   20
54    男      5      87   147   23
55    男      1      56   137   83
57    男      8      12    42   49
58    男      8      78    61  124
..   ..    ...     ...   ...  ...
234   男      6     134    13   11
235   男      2     116    39   49
238   男      4      99   145  149
241   男      1      69    91   40
242   男      4      53    97   97
244   男      6      20    71   20
246   男      8       0   143   66
247   男      1      95    81   89
251   男      3      56    53   23
254   男      2      15    15   17
255   男      5      46    13  112
256   男      2     143    68  129
261   男      1      87    57   94
262   男      2     124    38   36
264   男      8      47   126   84
266   男      7       6    37   51
267   男      2       3   127   85
272   男      4      88     7  112
275   男      3     102   118  149
276   男      6     109    35  122
277   男      3      84   139   88
278   男      7       9     7  118
280   男      8     130    79   42
285   男      4     114   116  143
289   男      5      89    84   64
290   男      7      54   128   34
291   男      5     105   132  112
293   男      3      49    72   71
294   男      4       6    81  128
299   男      2     134    59   57

[137 rows x 5 columns]
In [271]:
# 多分组
for name ,group in df.groupby(by = ['sex','class']): # sex 2,class 8: 16组
    print(name)
    print(group)
('女', 1)
    sex  class  Python  Math   En
12    女      1      77   132   10
47    女      1      89   120    2
56    女      1       0    13   27
64    女      1     113    20  112
70    女      1      76    66  135
92    女      1      19    42   91
108   女      1      74   149   31
116   女      1      24     1   31
127   女      1      28   105   67
129   女      1       9    82   75
135   女      1      65   115   18
138   女      1      17   119   63
150   女      1     100   129   55
151   女      1       6     6  120
177   女      1      45    59   23
180   女      1      91    55   18
220   女      1      80    11  119
250   女      1     135   120   46
258   女      1      27    71  123
270   女      1     115    99   28
281   女      1     135    59  118
295   女      1     132    55  128
('女', 2)
    sex  class  Python  Math   En
41    女      2      39    10   24
45    女      2      87   107   52
49    女      2     119    95   47
65    女      2      74    14  104
93    女      2      77   127    3
96    女      2     144   102   29
107   女      2     137   137   28
119   女      2     127    57   36
145   女      2      71     1    3
164   女      2      98   110  123
170   女      2      19   104  109
178   女      2     137    54   48
186   女      2     148    66   75
187   女      2      21    63  111
189   女      2      95    15   83
191   女      2      23    87   29
228   女      2      39    59   63
297   女      2      54   147   25
('女', 3)
    sex  class  Python  Math   En
23    女      3      20    57   81
87    女      3     136    54   31
110   女      3      26    42   21
124   女      3      36   116  125
158   女      3      98    71   34
194   女      3      36    17   59
196   女      3      18    99   53
197   女      3     101    50  112
207   女      3      16    69  136
232   女      3      95   125  133
239   女      3       9    65  104
260   女      3       8    73   58
263   女      3       4   125   97
268   女      3      27   132   79
271   女      3      31    47  134
283   女      3      25   131   92
287   女      3      39    35   89
('女', 4)
    sex  class  Python  Math   En
15    女      4      33    87   85
34    女      4      50   140   17
48    女      4      50    83   41
78    女      4      79   129   68
88    女      4      94    14   72
105   女      4     133    37   69
121   女      4      36     6   60
125   女      4      30   142   38
132   女      4     122    74   23
157   女      4      88    61   57
167   女      4     102    81   88
173   女      4       3    55   72
206   女      4      31    75   44
259   女      4      45    86    8
265   女      4     136   118  120
286   女      4      12    79   69
298   女      4      29   133   51
('女', 5)
    sex  class  Python  Math   En
8     女      5      34     1   69
9     女      5      52    19  104
14    女      5      53    99  142
17    女      5      76    28   53
30    女      5      88   139   30
60    女      5      28    70  127
61    女      5      75   103    9
77    女      5      51    24   63
84    女      5     120    23   56
102   女      5      61    76   59
104   女      5      53   143  128
115   女      5     145   118  112
137   女      5      71    90  142
141   女      5     109    26   95
156   女      5      85    92   88
171   女      5      19     6   98
200   女      5     116    19  138
208   女      5      46   137  132
224   女      5      67    39   71
230   女      5      27    76  105
240   女      5      60    24   32
257   女      5     150   101  147
269   女      5      41   145   24
274   女      5      64    55   63
296   女      5      40   142  145
('女', 6)
    sex  class  Python  Math   En
0     女      6     118    74  108
21    女      6       3   119   93
36    女      6      32    71  106
50    女      6      42    82   27
53    女      6     139   137  141
72    女      6      90    20   85
81    女      6      38    21    4
106   女      6       2   103  113
160   女      6      89   133   32
216   女      6      65   138   76
222   女      6     119    82   91
225   女      6      15   104   13
243   女      6       6   132   43
249   女      6      65    25   95
253   女      6     121   125  141
282   女      6     101    41   46
284   女      6     103    23   40
('女', 7)
    sex  class  Python  Math   En
16    女      7     122    98   73
18    女      7      90    73   36
75    女      7      97   132   61
91    女      7     144    57  115
94    女      7     148     1  150
98    女      7     103   127   91
109   女      7     120    26  121
130   女      7     107   149  120
143   女      7      84    81  115
144   女      7       0    14  139
152   女      7     141    29  111
169   女      7      83    11   43
172   女      7      85    34  101
198   女      7      89   139  137
213   女      7     133    46  143
219   女      7     135    86   10
236   女      7      82   142   41
252   女      7     135    10   45
279   女      7      20    73  114
292   女      7     144    71   23
('女', 8)
    sex  class  Python  Math   En
4     女      8     125    66   95
19    女      8     108    50  135
28    女      8     115   150   29
29    女      8      81    17    9
37    女      8      36   136  150
46    女      8      29    36   90
51    女      8     148    18  139
63    女      8     102    19   44
67    女      8      52    52   73
79    女      8      13    19  128
103   女      8      86   129   25
114   女      8      19    20    6
149   女      8      61    53  140
159   女      8      14   101  133
175   女      8      65    93  136
179   女      8      73     9   88
184   女      8      17     0  119
188   女      8      99   113  123
204   女      8      42    61  149
212   女      8      91    31  136
227   女      8     133    12   16
233   女      8     127    26   35
237   女      8      33   106  143
245   女      8      56   145  145
248   女      8      46    99   96
273   女      8      71    16  105
288   女      8      48    21  122
('男', 1)
    sex  class  Python  Math   En
24    男      1      24    21  147
55    男      1      56   137   83
85    男      1      69    41   22
89    男      1     149    94    5
90    男      1      99    14   71
95    男      1     114    67   31
142   男      1      72    18   80
162   男      1     104     9   88
183   男      1      10     7  104
202   男      1      97   105   13
214   男      1     130   135   96
241   男      1      69    91   40
247   男      1      95    81   89
261   男      1      87    57   94
('男', 2)
    sex  class  Python  Math   En
11    男      2      53    52  128
31    男      2      45    65   30
39    男      2     111   105   48
42    男      2      34   136   89
69    男      2      46    89   14
83    男      2      34    40   94
86    男      2      35    37    8
97    男      2     141     0   72
111   男      2     109   116   68
120   男      2      64    47  117
126   男      2      51    12  139
155   男      2     111    78   96
163   男      2       8    23   30
165   男      2      66   101    6
166   男      2      84   148   43
195   男      2      94    55   59
203   男      2      40    48    9
221   男      2      23    24   34
235   男      2     116    39   49
254   男      2      15    15   17
256   男      2     143    68  129
262   男      2     124    38   36
267   男      2       3   127   85
299   男      2     134    59   57
('男', 3)
    sex  class  Python  Math   En
2     男      3      83    45   31
3     男      3      61   140   52
6     男      3      11     5  114
26    男      3      88   147   78
59    男      3      47   122   84
71    男      3      71   130   17
73    男      3      55    71    1
101   男      3     115    65   75
128   男      3       5    43   23
133   男      3      80   134   76
148   男      3     113    47   47
153   男      3     121   126   89
190   男      3      70    53   94
199   男      3     121   108   46
210   男      3     120   122  144
217   男      3     101    55  110
251   男      3      56    53   23
275   男      3     102   118  149
277   男      3      84   139   88
293   男      3      49    72   71
('男', 4)
    sex  class  Python  Math   En
33    男      4     116    46  102
80    男      4      55   149  124
118   男      4     120    32  126
139   男      4      40   131   63
174   男      4      47    40   81
193   男      4     146    88  139
201   男      4      22    46  113
215   男      4     122   140   48
223   男      4      43    13   55
238   男      4      99   145  149
242   男      4      53    97   97
272   男      4      88     7  112
285   男      4     114   116  143
294   男      4       6    81  128
('男', 5)
    sex  class  Python  Math   En
20    男      5      21    83   26
35    男      5      68   127  144
38    男      5      30   146   31
54    男      5      87   147   23
66    男      5      87    48  139
181   男      5      48   120   43
182   男      5      27    96   62
192   男      5     105    37  127
226   男      5     127   115  137
255   男      5      46    13  112
289   男      5      89    84   64
291   男      5     105   132  112
('男', 6)
    sex  class  Python  Math   En
1     男      6      92   107  123
7     男      6      66    23  138
43    男      6      47    49   54
52    男      6      23    14   20
68    男      6      54    31   81
76    男      6      24    40  104
82    男      6       2   147   80
122   男      6      61   123   70
123   男      6      54    41   11
131   男      6      81    45  124
134   男      6      56    17   55
140   男      6      29    37  128
147   男      6      16     5   45
176   男      6     114   100  127
205   男      6      42    97   38
211   男      6     104   130    6
218   男      6     103    48  129
229   男      6      13     5   23
234   男      6     134    13   11
244   男      6      20    71   20
276   男      6     109    35  122
('男', 7)
    sex  class  Python  Math   En
5     男      7      15   106   40
10    男      7      24   101   48
13    男      7     125    63  112
22    男      7     137    12   58
32    男      7      93     4   41
74    男      7      67    46  108
99    男      7      85   144   53
113   男      7     145   103  111
117   男      7      99    22   57
146   男      7       2   137   62
154   男      7     128    46  128
266   男      7       6    37   51
278   男      7       9     7  118
290   男      7      54   128   34
('男', 8)
    sex  class  Python  Math   En
25    男      8     140    93  129
27    男      8     113    11   43
40    男      8     117    57   72
44    男      8     106    50   70
57    男      8      12    42   49
58    男      8      78    61  124
62    男      8      92    47   30
100   男      8       1   126   49
112   男      8     104    55    7
136   男      8     138   118  101
161   男      8      19     5   33
168   男      8      50   150  125
185   男      8      97   135  118
209   男      8     118    32    3
231   男      8      17    74  141
246   男      8       0   143   66
264   男      8      47   126   84
280   男      8     130    79   42
In [272]:
g = df.groupby(by = 'sex')[['Math','En']] # 分组取数据
In [273]:
m = {'sex':'category','class':'category','Python':'IT','Keras':'IT','Tensorflow':'IT','Java':'IT','C++':'IT'}
for name,data in df.groupby(m,axis = 0):
    print('组名',name)
    print('数据',data)
In [274]:
for name,group in g:
    print(name)
    print(group)
女
    sex  class  Python  Math   En
0     女      6     118    74  108
4     女      8     125    66   95
8     女      5      34     1   69
9     女      5      52    19  104
12    女      1      77   132   10
14    女      5      53    99  142
15    女      4      33    87   85
16    女      7     122    98   73
17    女      5      76    28   53
18    女      7      90    73   36
19    女      8     108    50  135
21    女      6       3   119   93
23    女      3      20    57   81
28    女      8     115   150   29
29    女      8      81    17    9
30    女      5      88   139   30
34    女      4      50   140   17
36    女      6      32    71  106
37    女      8      36   136  150
41    女      2      39    10   24
45    女      2      87   107   52
46    女      8      29    36   90
47    女      1      89   120    2
48    女      4      50    83   41
49    女      2     119    95   47
50    女      6      42    82   27
51    女      8     148    18  139
53    女      6     139   137  141
56    女      1       0    13   27
60    女      5      28    70  127
..   ..    ...     ...   ...  ...
248   女      8      46    99   96
249   女      6      65    25   95
250   女      1     135   120   46
252   女      7     135    10   45
253   女      6     121   125  141
257   女      5     150   101  147
258   女      1      27    71  123
259   女      4      45    86    8
260   女      3       8    73   58
263   女      3       4   125   97
265   女      4     136   118  120
268   女      3      27   132   79
269   女      5      41   145   24
270   女      1     115    99   28
271   女      3      31    47  134
273   女      8      71    16  105
274   女      5      64    55   63
279   女      7      20    73  114
281   女      1     135    59  118
282   女      6     101    41   46
283   女      3      25   131   92
284   女      6     103    23   40
286   女      4      12    79   69
287   女      3      39    35   89
288   女      8      48    21  122
292   女      7     144    71   23
295   女      1     132    55  128
296   女      5      40   142  145
297   女      2      54   147   25
298   女      4      29   133   51

[163 rows x 5 columns]
男
    sex  class  Python  Math   En
1     男      6      92   107  123
2     男      3      83    45   31
3     男      3      61   140   52
5     男      7      15   106   40
6     男      3      11     5  114
7     男      6      66    23  138
10    男      7      24   101   48
11    男      2      53    52  128
13    男      7     125    63  112
20    男      5      21    83   26
22    男      7     137    12   58
24    男      1      24    21  147
25    男      8     140    93  129
26    男      3      88   147   78
27    男      8     113    11   43
31    男      2      45    65   30
32    男      7      93     4   41
33    男      4     116    46  102
35    男      5      68   127  144
38    男      5      30   146   31
39    男      2     111   105   48
40    男      8     117    57   72
42    男      2      34   136   89
43    男      6      47    49   54
44    男      8     106    50   70
52    男      6      23    14   20
54    男      5      87   147   23
55    男      1      56   137   83
57    男      8      12    42   49
58    男      8      78    61  124
..   ..    ...     ...   ...  ...
234   男      6     134    13   11
235   男      2     116    39   49
238   男      4      99   145  149
241   男      1      69    91   40
242   男      4      53    97   97
244   男      6      20    71   20
246   男      8       0   143   66
247   男      1      95    81   89
251   男      3      56    53   23
254   男      2      15    15   17
255   男      5      46    13  112
256   男      2     143    68  129
261   男      1      87    57   94
262   男      2     124    38   36
264   男      8      47   126   84
266   男      7       6    37   51
267   男      2       3   127   85
272   男      4      88     7  112
275   男      3     102   118  149
276   男      6     109    35  122
277   男      3      84   139   88
278   男      7       9     7  118
280   男      8     130    79   42
285   男      4     114   116  143
289   男      5      89    84   64
290   男      7      54   128   34
291   男      5     105   132  112
293   男      3      49    72   71
294   男      4       6    81  128
299   男      2     134    59   57

[137 rows x 5 columns]
In [275]:
for name ,group in df['Math'].groupby([df['sex'],df['class']]):
    print(name)
    print(group)
('女', 1)
12     132
47     120
56      13
64      20
70      66
92      42
108    149
116      1
127    105
129     82
135    115
138    119
150    129
151      6
177     59
180     55
220     11
250    120
258     71
270     99
281     59
295     55
Name: Math, dtype: int64
('女', 2)
41      10
45     107
49      95
65      14
93     127
96     102
107    137
119     57
145      1
164    110
170    104
178     54
186     66
187     63
189     15
191     87
228     59
297    147
Name: Math, dtype: int64
('女', 3)
23      57
87      54
110     42
124    116
158     71
194     17
196     99
197     50
207     69
232    125
239     65
260     73
263    125
268    132
271     47
283    131
287     35
Name: Math, dtype: int64
('女', 4)
15      87
34     140
48      83
78     129
88      14
105     37
121      6
125    142
132     74
157     61
167     81
173     55
206     75
259     86
265    118
286     79
298    133
Name: Math, dtype: int64
('女', 5)
8        1
9       19
14      99
17      28
30     139
60      70
61     103
77      24
84      23
102     76
104    143
115    118
137     90
141     26
156     92
171      6
200     19
208    137
224     39
230     76
240     24
257    101
269    145
274     55
296    142
Name: Math, dtype: int64
('女', 6)
0       74
21     119
36      71
50      82
53     137
72      20
81      21
106    103
160    133
216    138
222     82
225    104
243    132
249     25
253    125
282     41
284     23
Name: Math, dtype: int64
('女', 7)
16      98
18      73
75     132
91      57
94       1
98     127
109     26
130    149
143     81
144     14
152     29
169     11
172     34
198    139
213     46
219     86
236    142
252     10
279     73
292     71
Name: Math, dtype: int64
('女', 8)
4       66
19      50
28     150
29      17
37     136
46      36
51      18
63      19
67      52
79      19
103    129
114     20
149     53
159    101
175     93
179      9
184      0
188    113
204     61
212     31
227     12
233     26
237    106
245    145
248     99
273     16
288     21
Name: Math, dtype: int64
('男', 1)
24      21
55     137
85      41
89      94
90      14
95      67
142     18
162      9
183      7
202    105
214    135
241     91
247     81
261     57
Name: Math, dtype: int64
('男', 2)
11      52
31      65
39     105
42     136
69      89
83      40
86      37
97       0
111    116
120     47
126     12
155     78
163     23
165    101
166    148
195     55
203     48
221     24
235     39
254     15
256     68
262     38
267    127
299     59
Name: Math, dtype: int64
('男', 3)
2       45
3      140
6        5
26     147
59     122
71     130
73      71
101     65
128     43
133    134
148     47
153    126
190     53
199    108
210    122
217     55
251     53
275    118
277    139
293     72
Name: Math, dtype: int64
('男', 4)
33      46
80     149
118     32
139    131
174     40
193     88
201     46
215    140
223     13
238    145
242     97
272      7
285    116
294     81
Name: Math, dtype: int64
('男', 5)
20      83
35     127
38     146
54     147
66      48
181    120
182     96
192     37
226    115
255     13
289     84
291    132
Name: Math, dtype: int64
('男', 6)
1      107
7       23
43      49
52      14
68      31
76      40
82     147
122    123
123     41
131     45
134     17
140     37
147      5
176    100
205     97
211    130
218     48
229      5
234     13
244     71
276     35
Name: Math, dtype: int64
('男', 7)
5      106
10     101
13      63
22      12
32       4
74      46
99     144
113    103
117     22
146    137
154     46
266     37
278      7
290    128
Name: Math, dtype: int64
('男', 8)
25      93
27      11
40      57
44      50
57      42
58      61
62      47
100    126
112     55
136    118
161      5
168    150
185    135
209     32
231     74
246    143
264    126
280     79
Name: Math, dtype: int64
In [276]:
for name,group in df[['Math','Python']].groupby(df['sex']):
    print(name)
    print(group)
女
     Math  Python
0      74     118
4      66     125
8       1      34
9      19      52
12    132      77
14     99      53
15     87      33
16     98     122
17     28      76
18     73      90
19     50     108
21    119       3
23     57      20
28    150     115
29     17      81
30    139      88
34    140      50
36     71      32
37    136      36
41     10      39
45    107      87
46     36      29
47    120      89
48     83      50
49     95     119
50     82      42
51     18     148
53    137     139
56     13       0
60     70      28
..    ...     ...
248    99      46
249    25      65
250   120     135
252    10     135
253   125     121
257   101     150
258    71      27
259    86      45
260    73       8
263   125       4
265   118     136
268   132      27
269   145      41
270    99     115
271    47      31
273    16      71
274    55      64
279    73      20
281    59     135
282    41     101
283   131      25
284    23     103
286    79      12
287    35      39
288    21      48
292    71     144
295    55     132
296   142      40
297   147      54
298   133      29

[163 rows x 2 columns]
男
     Math  Python
1     107      92
2      45      83
3     140      61
5     106      15
6       5      11
7      23      66
10    101      24
11     52      53
13     63     125
20     83      21
22     12     137
24     21      24
25     93     140
26    147      88
27     11     113
31     65      45
32      4      93
33     46     116
35    127      68
38    146      30
39    105     111
40     57     117
42    136      34
43     49      47
44     50     106
52     14      23
54    147      87
55    137      56
57     42      12
58     61      78
..    ...     ...
234    13     134
235    39     116
238   145      99
241    91      69
242    97      53
244    71      20
246   143       0
247    81      95
251    53      56
254    15      15
255    13      46
256    68     143
261    57      87
262    38     124
264   126      47
266    37       6
267   127       3
272     7      88
275   118     102
276    35     109
277   139      84
278     7       9
280    79     130
285   116     114
289    84      89
290   128      54
291   132     105
293    72      49
294    81       6
299    59     134

[137 rows x 2 columns]
In [277]:
for name,group in df.groupby(df.dtypes,axis = 1):
    print(name)
    print(group)
int64
     class  Python  Math   En
0        6     118    74  108
1        6      92   107  123
2        3      83    45   31
3        3      61   140   52
4        8     125    66   95
5        7      15   106   40
6        3      11     5  114
7        6      66    23  138
8        5      34     1   69
9        5      52    19  104
10       7      24   101   48
11       2      53    52  128
12       1      77   132   10
13       7     125    63  112
14       5      53    99  142
15       4      33    87   85
16       7     122    98   73
17       5      76    28   53
18       7      90    73   36
19       8     108    50  135
20       5      21    83   26
21       6       3   119   93
22       7     137    12   58
23       3      20    57   81
24       1      24    21  147
25       8     140    93  129
26       3      88   147   78
27       8     113    11   43
28       8     115   150   29
29       8      81    17    9
..     ...     ...   ...  ...
270      1     115    99   28
271      3      31    47  134
272      4      88     7  112
273      8      71    16  105
274      5      64    55   63
275      3     102   118  149
276      6     109    35  122
277      3      84   139   88
278      7       9     7  118
279      7      20    73  114
280      8     130    79   42
281      1     135    59  118
282      6     101    41   46
283      3      25   131   92
284      6     103    23   40
285      4     114   116  143
286      4      12    79   69
287      3      39    35   89
288      8      48    21  122
289      5      89    84   64
290      7      54   128   34
291      5     105   132  112
292      7     144    71   23
293      3      49    72   71
294      4       6    81  128
295      1     132    55  128
296      5      40   142  145
297      2      54   147   25
298      4      29   133   51
299      2     134    59   57

[300 rows x 4 columns]
object
    sex
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    男
26    男
27    男
28    女
29    女
..   ..
270   女
271   女
272   男
273   女
274   女
275   男
276   男
277   男
278   男
279   女
280   男
281   女
282   女
283   女
284   女
285   男
286   女
287   女
288   女
289   男
290   男
291   男
292   女
293   男
294   男
295   女
296   女
297   女
298   女
299   男

[300 rows x 1 columns]
In [278]:
df = pd.DataFrame(data = {'sex':np.random.randint(0,2,size = 300),
                          'class':np.random.randint(1,9,size = 300),
                          'Python':np.random.randint(0,151,size = 300),
                          'Math':np.random.randint(0,151,size = 300),
                          'En':np.random.randint(0,151,size = 300)})
df['sex'] = df['sex'].map({0:'男',1:'女'})
df
Out[278]:
sex class Python Math En
0 男 5 64 88 36
1 女 2 30 78 77
2 男 6 34 35 120
3 男 3 46 75 132
4 女 2 48 7 87
5 女 4 85 61 142
6 女 8 145 39 11
7 男 2 149 137 89
8 男 5 103 116 98
9 女 7 112 8 100
10 男 5 68 8 3
11 男 6 58 23 105
12 男 4 38 57 51
13 女 2 89 2 112
14 男 2 45 143 25
15 女 5 123 119 75
16 男 4 31 30 40
17 女 6 82 67 147
18 女 7 55 58 129
19 女 5 62 48 117
20 男 1 118 44 88
21 男 3 95 76 93
22 女 6 136 46 8
23 男 2 93 99 67
24 女 6 107 147 130
25 女 5 42 117 145
26 男 2 69 92 77
27 女 5 0 115 46
28 男 3 118 143 83
29 男 8 78 149 133
... ... ... ... ... ...
270 女 8 118 56 50
271 女 5 8 99 91
272 男 8 76 98 74
273 男 5 36 56 6
274 女 1 80 8 48
275 男 8 103 7 99
276 男 3 91 48 84
277 男 4 25 40 149
278 男 1 69 126 66
279 女 4 121 17 74
280 女 1 62 55 141
281 女 7 59 45 51
282 女 7 44 69 84
283 男 8 75 47 51
284 女 1 39 40 51
285 男 2 60 75 33
286 男 1 61 75 90
287 男 5 146 44 124
288 女 8 125 130 88
289 女 1 125 143 132
290 男 5 10 14 130
291 女 4 82 56 110
292 女 1 150 137 124
293 女 7 66 98 64
294 女 3 34 56 99
295 男 2 113 107 106
296 男 3 149 25 149
297 女 2 37 43 137
298 女 1 148 97 83
299 男 4 46 103 111

300 rows × 5 columns

In [279]:
for name,group in df.groupby(by = 'sex'): # 单分组
    print(name)
    print(group)
女
    sex  class  Python  Math   En
1     女      2      30    78   77
4     女      2      48     7   87
5     女      4      85    61  142
6     女      8     145    39   11
9     女      7     112     8  100
13    女      2      89     2  112
15    女      5     123   119   75
17    女      6      82    67  147
18    女      7      55    58  129
19    女      5      62    48  117
22    女      6     136    46    8
24    女      6     107   147  130
25    女      5      42   117  145
27    女      5       0   115   46
34    女      4      86    97   29
35    女      2      48    79   26
36    女      7     143    29  105
39    女      4      65    51   11
41    女      4      87   127  113
48    女      5     135   119   16
49    女      3     118   140  113
51    女      5     122   146   39
52    女      3      38    49  141
53    女      1      10    60   37
54    女      3      50    55   68
55    女      6      44    47  127
58    女      2      55   117   18
59    女      8      62     5   43
62    女      8     101   106   88
63    女      5      37   116   17
..   ..    ...     ...   ...  ...
254   女      5      15    23   35
255   女      1     105   138  109
257   女      8       3   147   45
258   女      3      22    80   62
259   女      4     123    43  143
260   女      3     147   126   30
261   女      2     147    98   19
262   女      1      95    16   57
263   女      7      95    92  100
264   女      5       4    16  122
265   女      6      77    76    6
267   女      6      29   119    9
268   女      7      79   144   17
269   女      1     124    22   97
270   女      8     118    56   50
271   女      5       8    99   91
274   女      1      80     8   48
279   女      4     121    17   74
280   女      1      62    55  141
281   女      7      59    45   51
282   女      7      44    69   84
284   女      1      39    40   51
288   女      8     125   130   88
289   女      1     125   143  132
291   女      4      82    56  110
292   女      1     150   137  124
293   女      7      66    98   64
294   女      3      34    56   99
297   女      2      37    43  137
298   女      1     148    97   83

[156 rows x 5 columns]
男
    sex  class  Python  Math   En
0     男      5      64    88   36
2     男      6      34    35  120
3     男      3      46    75  132
7     男      2     149   137   89
8     男      5     103   116   98
10    男      5      68     8    3
11    男      6      58    23  105
12    男      4      38    57   51
14    男      2      45   143   25
16    男      4      31    30   40
20    男      1     118    44   88
21    男      3      95    76   93
23    男      2      93    99   67
26    男      2      69    92   77
28    男      3     118   143   83
29    男      8      78   149  133
30    男      5     128   111   44
31    男      4     139   134   45
32    男      3      19    62   14
33    男      5     135   107   90
37    男      1     108    71  110
38    男      1     120     1   59
40    男      7     149    34   21
42    男      7     105   133  106
43    男      4     119   121   28
44    男      8      49     1  125
45    男      4     145     4   68
46    男      8     116    63   99
47    男      5     140    45  126
50    男      8     148   134    1
..   ..    ...     ...   ...  ...
225   男      8      58   134    1
227   男      4      88   137   68
230   男      3     103   106    8
232   男      8     131    29   91
233   男      5      79    94   46
238   男      8     116   106  133
239   男      5     112    99   44
240   男      4      12    39   63
241   男      1     138    54  101
246   男      6      33    32   68
248   男      7     106    85  120
249   男      7     110   108   50
252   男      7      11    71  128
253   男      7      57    39  102
256   男      2      39   138   71
266   男      7     134   147   65
272   男      8      76    98   74
273   男      5      36    56    6
275   男      8     103     7   99
276   男      3      91    48   84
277   男      4      25    40  149
278   男      1      69   126   66
283   男      8      75    47   51
285   男      2      60    75   33
286   男      1      61    75   90
287   男      5     146    44  124
290   男      5      10    14  130
295   男      2     113   107  106
296   男      3     149    25  149
299   男      4      46   103  111

[144 rows x 5 columns]
In [280]:
for name,group in df.groupby(by = ['sex','class']): # 多分组,性别2,class 8 = 16
    print(name)
    print(group)
('女', 1)
    sex  class  Python  Math   En
53    女      1      10    60   37
67    女      1      25    53   38
68    女      1     121    78  149
85    女      1     115    70   88
90    女      1     134    53   68
91    女      1      63   141  147
98    女      1     120    10  112
180   女      1     140    86   69
186   女      1      35     4   28
206   女      1      72   149   76
229   女      1     132     6   32
247   女      1     149    25  102
255   女      1     105   138  109
262   女      1      95    16   57
269   女      1     124    22   97
274   女      1      80     8   48
280   女      1      62    55  141
284   女      1      39    40   51
289   女      1     125   143  132
292   女      1     150   137  124
298   女      1     148    97   83
('女', 2)
    sex  class  Python  Math   En
1     女      2      30    78   77
4     女      2      48     7   87
13    女      2      89     2  112
35    女      2      48    79   26
58    女      2      55   117   18
71    女      2      24   124  127
89    女      2     106    86  112
96    女      2      45   107   67
113   女      2      61    56   94
118   女      2      33   130  148
143   女      2     121   110    1
145   女      2       6   142  131
182   女      2      26    46    4
199   女      2      77    46  132
200   女      2      61   149   47
204   女      2     142    53   14
213   女      2     148   105  145
216   女      2      42   104  149
261   女      2     147    98   19
297   女      2      37    43  137
('女', 3)
    sex  class  Python  Math   En
49    女      3     118   140  113
52    女      3      38    49  141
54    女      3      50    55   68
73    女      3       1    45  133
83    女      3     147   113   35
95    女      3     104   129   55
107   女      3     130    34   96
111   女      3      99    26   51
120   女      3     132     6  113
140   女      3      15    95   13
155   女      3      39    76  133
185   女      3      71    46   77
226   女      3     134    83   15
237   女      3      95    89    1
258   女      3      22    80   62
260   女      3     147   126   30
294   女      3      34    56   99
('女', 4)
    sex  class  Python  Math   En
5     女      4      85    61  142
34    女      4      86    97   29
39    女      4      65    51   11
41    女      4      87   127  113
70    女      4      62   114   95
92    女      4      52     1   45
117   女      4      97   120   18
129   女      4      89   144  137
157   女      4     124   132   62
163   女      4      19   121  132
173   女      4      58   112   42
187   女      4      88   147   40
193   女      4      45   106   86
203   女      4     129   118   53
207   女      4     101    42  150
209   女      4      23    21  145
215   女      4     124    93   71
231   女      4     105    45   36
251   女      4     127   100   89
259   女      4     123    43  143
279   女      4     121    17   74
291   女      4      82    56  110
('女', 5)
    sex  class  Python  Math   En
15    女      5     123   119   75
19    女      5      62    48  117
25    女      5      42   117  145
27    女      5       0   115   46
48    女      5     135   119   16
51    女      5     122   146   39
63    女      5      37   116   17
64    女      5      42    56   28
78    女      5      61    23   88
105   女      5      53   130  107
106   女      5     140    65   39
110   女      5      77   128    3
119   女      5     108   112  119
148   女      5     145    39   75
152   女      5     105    77   89
170   女      5      35   120   55
171   女      5      15    68   52
205   女      5     107   119   73
219   女      5      73    69   74
236   女      5      43    37   65
254   女      5      15    23   35
264   女      5       4    16  122
271   女      5       8    99   91
('女', 6)
    sex  class  Python  Math   En
17    女      6      82    67  147
22    女      6     136    46    8
24    女      6     107   147  130
55    女      6      44    47  127
99    女      6      71    60   56
128   女      6     120    81   57
133   女      6      66    65   62
142   女      6     136    19   49
154   女      6      65   142   16
181   女      6     135    83   10
202   女      6      61   148   40
265   女      6      77    76    6
267   女      6      29   119    9
('女', 7)
    sex  class  Python  Math   En
9     女      7     112     8  100
18    女      7      55    58  129
36    女      7     143    29  105
165   女      7     111    14  109
166   女      7      63   120  147
175   女      7      37    66    7
178   女      7     136     7   93
196   女      7      78   135   31
212   女      7      10   133   38
214   女      7      31   110  100
217   女      7      57   137   50
228   女      7     111     7   84
234   女      7      80   136   21
235   女      7      63   144   88
242   女      7      32     6   24
244   女      7      20   135   56
245   女      7     122   140  122
263   女      7      95    92  100
268   女      7      79   144   17
281   女      7      59    45   51
282   女      7      44    69   84
293   女      7      66    98   64
('女', 8)
    sex  class  Python  Math   En
6     女      8     145    39   11
59    女      8      62     5   43
62    女      8     101   106   88
84    女      8     123    84   26
124   女      8       3    24  118
141   女      8      74   149   99
146   女      8      10    75   34
164   女      8      53    16   30
167   女      8     136    88  129
197   女      8      27    45  140
198   女      8      60    85  100
218   女      8      26    20   55
220   女      8     122    32   13
243   女      8      51    16   26
250   女      8       3    27    4
257   女      8       3   147   45
270   女      8     118    56   50
288   女      8     125   130   88
('男', 1)
    sex  class  Python  Math   En
20    男      1     118    44   88
37    男      1     108    71  110
38    男      1     120     1   59
56    男      1      63   102   53
60    男      1      91    60    2
65    男      1      62    32   86
79    男      1       4    40  121
82    男      1     146   114  114
87    男      1      13   100    6
93    男      1      43    53   81
122   男      1     128    77   94
130   男      1     117    66   82
144   男      1      58   125   64
162   男      1       2   102   15
184   男      1     134    10   39
222   男      1     150    33    9
241   男      1     138    54  101
278   男      1      69   126   66
286   男      1      61    75   90
('男', 2)
    sex  class  Python  Math   En
7     男      2     149   137   89
14    男      2      45   143   25
23    男      2      93    99   67
26    男      2      69    92   77
108   男      2      49    29  136
121   男      2      15    70  138
195   男      2      10    97   50
256   男      2      39   138   71
285   男      2      60    75   33
295   男      2     113   107  106
('男', 3)
    sex  class  Python  Math   En
3     男      3      46    75  132
21    男      3      95    76   93
28    男      3     118   143   83
32    男      3      19    62   14
57    男      3      76    65   66
69    男      3     149    93    5
76    男      3      52    85   80
80    男      3      21   147   72
101   男      3       4    92    5
102   男      3     110   109   90
132   男      3      48    51    8
139   男      3      39     3   20
174   男      3      72   116  150
179   男      3      64   137   47
190   男      3      72     3  127
211   男      3      74    14   21
221   男      3      92   140    8
230   男      3     103   106    8
276   男      3      91    48   84
296   男      3     149    25  149
('男', 4)
    sex  class  Python  Math   En
12    男      4      38    57   51
16    男      4      31    30   40
31    男      4     139   134   45
43    男      4     119   121   28
45    男      4     145     4   68
81    男      4      80    52   38
86    男      4     150   106   10
94    男      4     117    94   96
138   男      4     141    61   10
147   男      4     111   107   38
159   男      4      22    14  148
160   男      4     143    68   78
172   男      4      75     6  103
183   男      4     101    80   61
194   男      4      63    21   84
224   男      4     114   101   53
227   男      4      88   137   68
240   男      4      12    39   63
277   男      4      25    40  149
299   男      4      46   103  111
('男', 5)
    sex  class  Python  Math   En
0     男      5      64    88   36
8     男      5     103   116   98
10    男      5      68     8    3
30    男      5     128   111   44
33    男      5     135   107   90
47    男      5     140    45  126
61    男      5      12    92   47
74    男      5      15   111   65
97    男      5     148    17   30
100   男      5      24    20  137
115   男      5     142   141  117
126   男      5      61   106    1
127   男      5     119    23   67
131   男      5      41    43   51
136   男      5      52   110  107
149   男      5      59    49   29
153   男      5     103    13   75
158   男      5      69    29   60
188   男      5     120    88   87
201   男      5     100   148   68
208   男      5     101   120   49
233   男      5      79    94   46
239   男      5     112    99   44
273   男      5      36    56    6
287   男      5     146    44  124
290   男      5      10    14  130
('男', 6)
    sex  class  Python  Math   En
2     男      6      34    35  120
11    男      6      58    23  105
72    男      6      82    68   83
77    男      6      77    17   67
88    男      6      42    94  138
114   男      6      77    43   77
116   男      6      36    31  124
168   男      6      60   111   83
177   男      6     101   120  120
210   男      6      75    76   25
246   男      6      33    32   68
('男', 7)
    sex  class  Python  Math   En
40    男      7     149    34   21
42    男      7     105   133  106
66    男      7      63    50  138
75    男      7      46     7   27
109   男      7      59    22   45
112   男      7      38    61   88
123   男      7      41   137    0
134   男      7      88    86  136
135   男      7      36   104  108
137   男      7     142    45   30
150   男      7      96   139   80
151   男      7      14    75   78
156   男      7      41    34  124
161   男      7      30    88   20
169   男      7      79     2   38
176   男      7      66     0   97
189   男      7     124    52   67
191   男      7     117    25  137
223   男      7     139   134   55
248   男      7     106    85  120
249   男      7     110   108   50
252   男      7      11    71  128
253   男      7      57    39  102
266   男      7     134   147   65
('男', 8)
    sex  class  Python  Math   En
29    男      8      78   149  133
44    男      8      49     1  125
46    男      8     116    63   99
50    男      8     148   134    1
103   男      8     125   106   92
104   男      8      33   128   38
125   男      8     129    30  141
192   男      8      78    38   85
225   男      8      58   134    1
232   男      8     131    29   91
238   男      8     116   106  133
272   男      8      76    98   74
275   男      8     103     7   99
283   男      8      75    47   51
In [281]:
for name,group in df[['Python','Math']].groupby(df['sex']):
    print(name,group)
女      Python  Math
1        30    78
4        48     7
5        85    61
6       145    39
9       112     8
13       89     2
15      123   119
17       82    67
18       55    58
19       62    48
22      136    46
24      107   147
25       42   117
27        0   115
34       86    97
35       48    79
36      143    29
39       65    51
41       87   127
48      135   119
49      118   140
51      122   146
52       38    49
53       10    60
54       50    55
55       44    47
58       55   117
59       62     5
62      101   106
63       37   116
..      ...   ...
254      15    23
255     105   138
257       3   147
258      22    80
259     123    43
260     147   126
261     147    98
262      95    16
263      95    92
264       4    16
265      77    76
267      29   119
268      79   144
269     124    22
270     118    56
271       8    99
274      80     8
279     121    17
280      62    55
281      59    45
282      44    69
284      39    40
288     125   130
289     125   143
291      82    56
292     150   137
293      66    98
294      34    56
297      37    43
298     148    97

[156 rows x 2 columns]
男      Python  Math
0        64    88
2        34    35
3        46    75
7       149   137
8       103   116
10       68     8
11       58    23
12       38    57
14       45   143
16       31    30
20      118    44
21       95    76
23       93    99
26       69    92
28      118   143
29       78   149
30      128   111
31      139   134
32       19    62
33      135   107
37      108    71
38      120     1
40      149    34
42      105   133
43      119   121
44       49     1
45      145     4
46      116    63
47      140    45
50      148   134
..      ...   ...
225      58   134
227      88   137
230     103   106
232     131    29
233      79    94
238     116   106
239     112    99
240      12    39
241     138    54
246      33    32
248     106    85
249     110   108
252      11    71
253      57    39
256      39   138
266     134   147
272      76    98
273      36    56
275     103     7
276      91    48
277      25    40
278      69   126
283      75    47
285      60    75
286      61    75
287     146    44
290      10    14
295     113   107
296     149    25
299      46   103

[144 rows x 2 columns]
In [282]:
for name,group in df[['Python','Math']].groupby([df['sex'],df['class']]):
    print(name,group)
('女', 1)      Python  Math
53       10    60
67       25    53
68      121    78
85      115    70
90      134    53
91       63   141
98      120    10
180     140    86
186      35     4
206      72   149
229     132     6
247     149    25
255     105   138
262      95    16
269     124    22
274      80     8
280      62    55
284      39    40
289     125   143
292     150   137
298     148    97
('女', 2)      Python  Math
1        30    78
4        48     7
13       89     2
35       48    79
58       55   117
71       24   124
89      106    86
96       45   107
113      61    56
118      33   130
143     121   110
145       6   142
182      26    46
199      77    46
200      61   149
204     142    53
213     148   105
216      42   104
261     147    98
297      37    43
('女', 3)      Python  Math
49      118   140
52       38    49
54       50    55
73        1    45
83      147   113
95      104   129
107     130    34
111      99    26
120     132     6
140      15    95
155      39    76
185      71    46
226     134    83
237      95    89
258      22    80
260     147   126
294      34    56
('女', 4)      Python  Math
5        85    61
34       86    97
39       65    51
41       87   127
70       62   114
92       52     1
117      97   120
129      89   144
157     124   132
163      19   121
173      58   112
187      88   147
193      45   106
203     129   118
207     101    42
209      23    21
215     124    93
231     105    45
251     127   100
259     123    43
279     121    17
291      82    56
('女', 5)      Python  Math
15      123   119
19       62    48
25       42   117
27        0   115
48      135   119
51      122   146
63       37   116
64       42    56
78       61    23
105      53   130
106     140    65
110      77   128
119     108   112
148     145    39
152     105    77
170      35   120
171      15    68
205     107   119
219      73    69
236      43    37
254      15    23
264       4    16
271       8    99
('女', 6)      Python  Math
17       82    67
22      136    46
24      107   147
55       44    47
99       71    60
128     120    81
133      66    65
142     136    19
154      65   142
181     135    83
202      61   148
265      77    76
267      29   119
('女', 7)      Python  Math
9       112     8
18       55    58
36      143    29
165     111    14
166      63   120
175      37    66
178     136     7
196      78   135
212      10   133
214      31   110
217      57   137
228     111     7
234      80   136
235      63   144
242      32     6
244      20   135
245     122   140
263      95    92
268      79   144
281      59    45
282      44    69
293      66    98
('女', 8)      Python  Math
6       145    39
59       62     5
62      101   106
84      123    84
124       3    24
141      74   149
146      10    75
164      53    16
167     136    88
197      27    45
198      60    85
218      26    20
220     122    32
243      51    16
250       3    27
257       3   147
270     118    56
288     125   130
('男', 1)      Python  Math
20      118    44
37      108    71
38      120     1
56       63   102
60       91    60
65       62    32
79        4    40
82      146   114
87       13   100
93       43    53
122     128    77
130     117    66
144      58   125
162       2   102
184     134    10
222     150    33
241     138    54
278      69   126
286      61    75
('男', 2)      Python  Math
7       149   137
14       45   143
23       93    99
26       69    92
108      49    29
121      15    70
195      10    97
256      39   138
285      60    75
295     113   107
('男', 3)      Python  Math
3        46    75
21       95    76
28      118   143
32       19    62
57       76    65
69      149    93
76       52    85
80       21   147
101       4    92
102     110   109
132      48    51
139      39     3
174      72   116
179      64   137
190      72     3
211      74    14
221      92   140
230     103   106
276      91    48
296     149    25
('男', 4)      Python  Math
12       38    57
16       31    30
31      139   134
43      119   121
45      145     4
81       80    52
86      150   106
94      117    94
138     141    61
147     111   107
159      22    14
160     143    68
172      75     6
183     101    80
194      63    21
224     114   101
227      88   137
240      12    39
277      25    40
299      46   103
('男', 5)      Python  Math
0        64    88
8       103   116
10       68     8
30      128   111
33      135   107
47      140    45
61       12    92
74       15   111
97      148    17
100      24    20
115     142   141
126      61   106
127     119    23
131      41    43
136      52   110
149      59    49
153     103    13
158      69    29
188     120    88
201     100   148
208     101   120
233      79    94
239     112    99
273      36    56
287     146    44
290      10    14
('男', 6)      Python  Math
2        34    35
11       58    23
72       82    68
77       77    17
88       42    94
114      77    43
116      36    31
168      60   111
177     101   120
210      75    76
246      33    32
('男', 7)      Python  Math
40      149    34
42      105   133
66       63    50
75       46     7
109      59    22
112      38    61
123      41   137
134      88    86
135      36   104
137     142    45
150      96   139
151      14    75
156      41    34
161      30    88
169      79     2
176      66     0
189     124    52
191     117    25
223     139   134
248     106    85
249     110   108
252      11    71
253      57    39
266     134   147
('男', 8)      Python  Math
29       78   149
44       49     1
46      116    63
50      148   134
103     125   106
104      33   128
125     129    30
192      78    38
225      58   134
232     131    29
238     116   106
272      76    98
275     103     7
283      75    47
In [283]:
for name,group in df.groupby(df.dtypes,axis = 1): #根据数据类型进行分组
    print(name,group)
int64      class  Python  Math   En
0        5      64    88   36
1        2      30    78   77
2        6      34    35  120
3        3      46    75  132
4        2      48     7   87
5        4      85    61  142
6        8     145    39   11
7        2     149   137   89
8        5     103   116   98
9        7     112     8  100
10       5      68     8    3
11       6      58    23  105
12       4      38    57   51
13       2      89     2  112
14       2      45   143   25
15       5     123   119   75
16       4      31    30   40
17       6      82    67  147
18       7      55    58  129
19       5      62    48  117
20       1     118    44   88
21       3      95    76   93
22       6     136    46    8
23       2      93    99   67
24       6     107   147  130
25       5      42   117  145
26       2      69    92   77
27       5       0   115   46
28       3     118   143   83
29       8      78   149  133
..     ...     ...   ...  ...
270      8     118    56   50
271      5       8    99   91
272      8      76    98   74
273      5      36    56    6
274      1      80     8   48
275      8     103     7   99
276      3      91    48   84
277      4      25    40  149
278      1      69   126   66
279      4     121    17   74
280      1      62    55  141
281      7      59    45   51
282      7      44    69   84
283      8      75    47   51
284      1      39    40   51
285      2      60    75   33
286      1      61    75   90
287      5     146    44  124
288      8     125   130   88
289      1     125   143  132
290      5      10    14  130
291      4      82    56  110
292      1     150   137  124
293      7      66    98   64
294      3      34    56   99
295      2     113   107  106
296      3     149    25  149
297      2      37    43  137
298      1     148    97   83
299      4      46   103  111

[300 rows x 4 columns]
object     sex
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    女
26    男
27    女
28    男
29    男
..   ..
270   女
271   女
272   男
273   男
274   女
275   男
276   男
277   男
278   男
279   女
280   女
281   女
282   女
283   男
284   女
285   男
286   男
287   男
288   女
289   女
290   男
291   女
292   女
293   女
294   女
295   男
296   男
297   女
298   女
299   男

[300 rows x 1 columns]
In [284]:
m = {'sex':'category','class':'category','Python':'科目','Math':'科目','En':'科目'}
for name,group in df.groupby(by = m,axis = 1):
    print(name,group)
category     sex  class
0     男      5
1     女      2
2     男      6
3     男      3
4     女      2
5     女      4
6     女      8
7     男      2
8     男      5
9     女      7
10    男      5
11    男      6
12    男      4
13    女      2
14    男      2
15    女      5
16    男      4
17    女      6
18    女      7
19    女      5
20    男      1
21    男      3
22    女      6
23    男      2
24    女      6
25    女      5
26    男      2
27    女      5
28    男      3
29    男      8
..   ..    ...
270   女      8
271   女      5
272   男      8
273   男      5
274   女      1
275   男      8
276   男      3
277   男      4
278   男      1
279   女      4
280   女      1
281   女      7
282   女      7
283   男      8
284   女      1
285   男      2
286   男      1
287   男      5
288   女      8
289   女      1
290   男      5
291   女      4
292   女      1
293   女      7
294   女      3
295   男      2
296   男      3
297   女      2
298   女      1
299   男      4

[300 rows x 2 columns]
科目      Python  Math   En
0        64    88   36
1        30    78   77
2        34    35  120
3        46    75  132
4        48     7   87
5        85    61  142
6       145    39   11
7       149   137   89
8       103   116   98
9       112     8  100
10       68     8    3
11       58    23  105
12       38    57   51
13       89     2  112
14       45   143   25
15      123   119   75
16       31    30   40
17       82    67  147
18       55    58  129
19       62    48  117
20      118    44   88
21       95    76   93
22      136    46    8
23       93    99   67
24      107   147  130
25       42   117  145
26       69    92   77
27        0   115   46
28      118   143   83
29       78   149  133
..      ...   ...  ...
270     118    56   50
271       8    99   91
272      76    98   74
273      36    56    6
274      80     8   48
275     103     7   99
276      91    48   84
277      25    40  149
278      69   126   66
279     121    17   74
280      62    55  141
281      59    45   51
282      44    69   84
283      75    47   51
284      39    40   51
285      60    75   33
286      61    75   90
287     146    44  124
288     125   130   88
289     125   143  132
290      10    14  130
291      82    56  110
292     150   137  124
293      66    98   64
294      34    56   99
295     113   107  106
296     149    25  149
297      37    43  137
298     148    97   83
299      46   103  111

[300 rows x 3 columns]

分组聚合¶

In [ ]:
 
In [285]:
df.groupby(by = 'sex')[['Python','Math']].max() # 数学Python根据性别分组,求解的最大值
Out[285]:
Python Math
sex
女 150 149
男 150 149
In [286]:
df.groupby(by = ['sex','class']).mean().round(1)
Out[286]:
Python Math En
sex class
女 1 97.3 66.2 85.1
2 67.3 84.1 82.4
3 80.9 73.4 72.6
4 86.0 84.9 82.9
5 67.5 85.3 68.3
6 86.8 84.6 55.2
7 72.9 83.3 73.6
8 69.0 63.6 61.1
男 1 85.5 67.6 67.4
2 64.2 98.7 79.2
3 74.7 79.5 63.1
4 88.0 68.8 67.1
5 84.1 72.8 66.8
6 61.4 59.1 91.8
7 78.8 69.9 77.5
8 93.9 76.4 83.1
In [287]:
df.groupby(by = ['sex','class']).size() # 统计各个班级男女人数
Out[287]:
sex  class
女    1        21
     2        20
     3        17
     4        22
     5        23
     6        13
     7        22
     8        18
男    1        19
     2        10
     3        20
     4        20
     5        26
     6        11
     7        24
     8        14
dtype: int64
In [288]:
df.groupby(by = ['sex','class']).describe().round(1)
Out[288]:
Python Math En
count mean std min 25% 50% 75% max count mean ... 75% max count mean std min 25% 50% 75% max
sex class
女 1 21.0 97.3 44.1 10.0 63.0 115.0 132.0 150.0 21.0 66.2 ... 97.0 149.0 21.0 85.1 39.4 28.0 51.0 83.0 112.0 149.0
2 20.0 67.3 43.7 6.0 36.0 51.5 93.2 148.0 20.0 84.1 ... 111.8 149.0 20.0 82.4 53.6 1.0 24.2 90.5 131.2 149.0
3 17.0 80.9 50.0 1.0 38.0 95.0 130.0 147.0 17.0 73.4 ... 95.0 140.0 17.0 72.6 45.2 1.0 35.0 68.0 113.0 141.0
4 22.0 86.0 33.0 19.0 62.8 87.5 117.0 129.0 22.0 84.9 ... 119.5 147.0 22.0 82.9 45.6 11.0 42.8 80.0 127.2 150.0
5 23.0 67.5 46.9 0.0 36.0 61.0 107.5 145.0 23.0 85.3 ... 119.0 146.0 23.0 68.3 38.0 3.0 39.0 73.0 90.0 145.0
6 13.0 86.8 36.3 29.0 65.0 77.0 120.0 136.0 13.0 84.6 ... 119.0 148.0 13.0 55.2 49.9 6.0 10.0 49.0 62.0 147.0
7 22.0 72.9 37.6 10.0 46.8 64.5 107.0 143.0 22.0 83.3 ... 135.0 144.0 22.0 73.6 39.8 7.0 41.0 84.0 100.0 147.0
8 18.0 69.0 50.6 3.0 26.2 61.0 121.0 145.0 18.0 63.6 ... 87.2 149.0 18.0 61.1 43.0 4.0 27.0 47.5 96.2 140.0
男 1 19.0 85.5 48.2 2.0 59.5 91.0 124.0 150.0 19.0 67.6 ... 101.0 126.0 19.0 67.4 37.8 2.0 46.0 81.0 92.0 121.0
2 10.0 64.2 43.5 10.0 40.5 54.5 87.0 149.0 10.0 98.7 ... 129.5 143.0 10.0 79.2 38.9 25.0 54.2 74.0 101.8 138.0
3 20.0 74.7 40.0 4.0 47.5 73.0 97.0 149.0 20.0 79.5 ... 110.8 147.0 20.0 63.1 50.7 5.0 12.5 69.0 90.8 150.0
4 20.0 88.0 46.6 12.0 44.0 94.5 124.0 150.0 20.0 68.8 ... 103.8 137.0 20.0 67.1 39.2 10.0 39.5 62.0 87.0 149.0
5 26.0 84.1 44.6 10.0 53.8 89.5 119.8 148.0 26.0 72.8 ... 109.2 148.0 26.0 66.8 40.1 1.0 44.0 62.5 96.0 137.0
6 11.0 61.4 22.9 33.0 39.0 60.0 77.0 101.0 11.0 59.1 ... 85.0 120.0 11.0 91.8 33.1 25.0 72.5 83.0 120.0 138.0
7 24.0 78.8 42.6 11.0 41.0 72.5 111.8 149.0 24.0 69.9 ... 105.0 147.0 24.0 77.5 42.4 0.0 43.2 79.0 111.0 138.0
8 14.0 93.9 34.8 33.0 75.2 90.5 122.8 148.0 14.0 76.4 ... 122.5 149.0 14.0 83.1 45.9 1.0 56.8 91.5 118.5 141.0

16 rows × 24 columns

分组聚合apply、transform¶

In [289]:
# apply聚合结果,少
df.groupby(by = ['sex','class'])[['Python','En']].apply(np.mean).round(1)
Out[289]:
Python En
sex class
女 1 97.3 85.1
2 67.3 82.4
3 80.9 72.6
4 86.0 82.9
5 67.5 68.3
6 86.8 55.2
7 72.9 73.6
8 69.0 61.1
男 1 85.5 67.4
2 64.2 79.2
3 74.7 63.1
4 88.0 67.1
5 84.1 66.8
6 61.4 91.8
7 78.8 77.5
8 93.9 83.1
In [290]:
# transform 计算,返回的结果,还是DataFrame长度
df.groupby(by = ['sex','class'])[['Python','En']].transform(np.mean).round(1)
Out[290]:
Python En
0 84.1 66.8
1 67.3 82.4
2 61.4 91.8
3 74.7 63.1
4 67.3 82.4
5 86.0 82.9
6 69.0 61.1
7 64.2 79.2
8 84.1 66.8
9 72.9 73.6
10 84.1 66.8
11 61.4 91.8
12 88.0 67.1
13 67.3 82.4
14 64.2 79.2
15 67.5 68.3
16 88.0 67.1
17 86.8 55.2
18 72.9 73.6
19 67.5 68.3
20 85.5 67.4
21 74.7 63.1
22 86.8 55.2
23 64.2 79.2
24 86.8 55.2
25 67.5 68.3
26 64.2 79.2
27 67.5 68.3
28 74.7 63.1
29 93.9 83.1
... ... ...
270 69.0 61.1
271 67.5 68.3
272 93.9 83.1
273 84.1 66.8
274 97.3 85.1
275 93.9 83.1
276 74.7 63.1
277 88.0 67.1
278 85.5 67.4
279 86.0 82.9
280 97.3 85.1
281 72.9 73.6
282 72.9 73.6
283 93.9 83.1
284 97.3 85.1
285 64.2 79.2
286 85.5 67.4
287 84.1 66.8
288 69.0 61.1
289 97.3 85.1
290 84.1 66.8
291 86.0 82.9
292 97.3 85.1
293 72.9 73.6
294 80.9 72.6
295 64.2 79.2
296 74.7 63.1
297 67.3 82.4
298 97.3 85.1
299 88.0 67.1

300 rows × 2 columns

In [291]:
def _mean(x): #自己定义求平均值方法
    return np.round(x.mean(),1)
df.groupby(by = ['sex','class'])[['Python','En']].transform(_mean)
Out[291]:
Python En
0 84.1 66.8
1 67.3 82.4
2 61.4 91.8
3 74.7 63.1
4 67.3 82.4
5 86.0 82.9
6 69.0 61.1
7 64.2 79.2
8 84.1 66.8
9 72.9 73.6
10 84.1 66.8
11 61.4 91.8
12 88.0 67.1
13 67.3 82.4
14 64.2 79.2
15 67.5 68.3
16 88.0 67.1
17 86.8 55.2
18 72.9 73.6
19 67.5 68.3
20 85.5 67.4
21 74.7 63.1
22 86.8 55.2
23 64.2 79.2
24 86.8 55.2
25 67.5 68.3
26 64.2 79.2
27 67.5 68.3
28 74.7 63.1
29 93.9 83.1
... ... ...
270 69.0 61.1
271 67.5 68.3
272 93.9 83.1
273 84.1 66.8
274 97.3 85.1
275 93.9 83.1
276 74.7 63.1
277 88.0 67.1
278 85.5 67.4
279 86.0 82.9
280 97.3 85.1
281 72.9 73.6
282 72.9 73.6
283 93.9 83.1
284 97.3 85.1
285 64.2 79.2
286 85.5 67.4
287 84.1 66.8
288 69.0 61.1
289 97.3 85.1
290 84.1 66.8
291 86.0 82.9
292 97.3 85.1
293 72.9 73.6
294 80.9 72.6
295 64.2 79.2
296 74.7 63.1
297 67.3 82.4
298 97.3 85.1
299 88.0 67.1

300 rows × 2 columns

分组聚合agg¶

In [292]:
df.groupby(by = ['sex','class']).agg([np.mean,np.max,np.min]).round(1)
Out[292]:
Python Math En
mean amax amin mean amax amin mean amax amin
sex class
女 1 97.3 150 10 66.2 149 4 85.1 149 28
2 67.3 148 6 84.1 149 2 82.4 149 1
3 80.9 147 1 73.4 140 6 72.6 141 1
4 86.0 129 19 84.9 147 1 82.9 150 11
5 67.5 145 0 85.3 146 16 68.3 145 3
6 86.8 136 29 84.6 148 19 55.2 147 6
7 72.9 143 10 83.3 144 6 73.6 147 7
8 69.0 145 3 63.6 149 5 61.1 140 4
男 1 85.5 150 2 67.6 126 1 67.4 121 2
2 64.2 149 10 98.7 143 29 79.2 138 25
3 74.7 149 4 79.5 147 3 63.1 150 5
4 88.0 150 12 68.8 137 4 67.1 149 10
5 84.1 148 10 72.8 148 8 66.8 137 1
6 61.4 101 33 59.1 120 17 91.8 138 25
7 78.8 149 11 69.9 147 0 77.5 138 0
8 93.9 148 33 76.4 149 1 83.1 141 1
In [293]:
df.groupby(by = ['sex','class']).agg([('平均值',np.mean),('最大值',np.max),('最小值',np.min)]).round(1)
Out[293]:
Python Math En
平均值 最大值 最小值 平均值 最大值 最小值 平均值 最大值 最小值
sex class
女 1 97.3 150 10 66.2 149 4 85.1 149 28
2 67.3 148 6 84.1 149 2 82.4 149 1
3 80.9 147 1 73.4 140 6 72.6 141 1
4 86.0 129 19 84.9 147 1 82.9 150 11
5 67.5 145 0 85.3 146 16 68.3 145 3
6 86.8 136 29 84.6 148 19 55.2 147 6
7 72.9 143 10 83.3 144 6 73.6 147 7
8 69.0 145 3 63.6 149 5 61.1 140 4
男 1 85.5 150 2 67.6 126 1 67.4 121 2
2 64.2 149 10 98.7 143 29 79.2 138 25
3 74.7 149 4 79.5 147 3 63.1 150 5
4 88.0 150 12 68.8 137 4 67.1 149 10
5 84.1 148 10 72.8 148 8 66.8 137 1
6 61.4 101 33 59.1 120 17 91.8 138 25
7 78.8 149 11 69.9 147 0 77.5 138 0
8 93.9 148 33 76.4 149 1 83.1 141 1
In [294]:
# 不同列进行不同计算
df.groupby(by = ['sex','class']).agg({'Python':np.max,'Math':np.min,'En':np.mean}).round(1)
Out[294]:
Python Math En
sex class
女 1 150 4 85.1
2 148 2 82.4
3 147 6 72.6
4 129 1 82.9
5 145 16 68.3
6 136 19 55.2
7 143 6 73.6
8 145 5 61.1
男 1 150 1 67.4
2 149 29 79.2
3 149 3 63.1
4 150 4 67.1
5 148 8 66.8
6 101 17 91.8
7 149 0 77.5
8 148 1 83.1

透视表¶

In [295]:
df.pivot_table(values=['Python','En'],index = ['sex','class'],aggfunc='mean').round(1)
Out[295]:
En Python
sex class
女 1 85.1 97.3
2 82.4 67.3
3 72.6 80.9
4 82.9 86.0
5 68.3 67.5
6 55.2 86.8
7 73.6 72.9
8 61.1 69.0
男 1 67.4 85.5
2 79.2 64.2
3 63.1 74.7
4 67.1 88.0
5 66.8 84.1
6 91.8 61.4
7 77.5 78.8
8 83.1 93.9
In [ ]:
 
In [296]:
df.pivot_table(values=['Python','Math','En'], # 要’透视‘值
               index = ['sex','class'], # 索引,根据什么进行’透视‘ == 分组
               aggfunc={'Python':[('平均值',np.mean)],
                        'Math':[('最小值',np.min),('最大值',np.max)],
                        'En':[('标准差',np.std),('方差',np.var),('计数',np.size)]}).round(1)
Out[296]:
En Math Python
方差 标准差 计数 最大值 最小值 平均值
sex class
女 1 1553.1 39.4 21.0 149 4 97.3
2 2877.7 53.6 20.0 149 2 67.3
3 2039.9 45.2 17.0 140 6 80.9
4 2077.3 45.6 22.0 147 1 86.0
5 1441.6 38.0 23.0 146 16 67.5
6 2488.3 49.9 13.0 148 19 86.8
7 1588.0 39.8 22.0 144 6 72.9
8 1851.0 43.0 18.0 149 5 69.0
男 1 1426.5 37.8 19.0 126 1 85.5
2 1516.0 38.9 10.0 143 29 64.2
3 2565.5 50.7 20.0 147 3 74.7
4 1536.2 39.2 20.0 137 4 88.0
5 1605.3 40.1 26.0 148 8 84.1
6 1095.4 33.1 11.0 120 17 61.4
7 1801.7 42.4 24.0 147 0 78.8
8 2105.1 45.9 14.0 149 1 93.9
In [297]:
df.groupby(by = ['sex','class']).agg({'Python':[('平均值',np.mean)],
                        'Math':[('最小值',np.min),('最大值',np.max)],
                        'En':[('标准差',np.std),('方差',np.var),('计数',np.size)]}).round(1)
Out[297]:
Python Math En
平均值 最小值 最大值 标准差 方差 计数
sex class
女 1 97.3 4 149 39.4 1553.1 21
2 67.3 2 149 53.6 2877.7 20
3 80.9 6 140 45.2 2039.9 17
4 86.0 1 147 45.6 2077.3 22
5 67.5 16 146 38.0 1441.6 23
6 86.8 19 148 49.9 2488.3 13
7 72.9 6 144 39.8 1588.0 22
8 69.0 5 149 43.0 1851.0 18
男 1 85.5 1 126 37.8 1426.5 19
2 64.2 29 143 38.9 1516.0 10
3 74.7 3 147 50.7 2565.5 20
4 88.0 4 137 39.2 1536.2 20
5 84.1 8 148 40.1 1605.3 26
6 61.4 17 120 33.1 1095.4 11
7 78.8 0 147 42.4 1801.7 24
8 93.9 1 149 45.9 2105.1 14

时间序列¶

时间戳操作¶

In [298]:
pd.Timestamp('2020.09.15 20') # 时刻数据,具体点
Out[298]:
Timestamp('2020-09-15 20:00:00')
In [299]:
pd.Period('2020.09.15',freq='M') # 时期数据,表示一段时间,频率
Out[299]:
Period('2020-09', 'M')
In [300]:
index = pd.date_range('2020.09.15',freq='D',periods=10)
index
Out[300]:
DatetimeIndex(['2020-09-15', '2020-09-16', '2020-09-17', '2020-09-18',
               '2020-09-19', '2020-09-20', '2020-09-21', '2020-09-22',
               '2020-09-23', '2020-09-24'],
              dtype='datetime64[ns]', freq='D')
In [301]:
pd.period_range('2020.09.15',periods=10)
Out[301]:
PeriodIndex(['2020-09-15', '2020-09-16', '2020-09-17', '2020-09-18',
             '2020-09-19', '2020-09-20', '2020-09-21', '2020-09-22',
             '2020-09-23', '2020-09-24'],
            dtype='period[D]', freq='D')
In [302]:
ts = pd.Series(np.random.randint(0,10,size = 10),index = index)
ts
Out[302]:
2020-09-15    1
2020-09-16    9
2020-09-17    2
2020-09-18    8
2020-09-19    1
2020-09-20    5
2020-09-21    4
2020-09-22    1
2020-09-23    4
2020-09-24    5
Freq: D, dtype: int64
In [303]:
# 时间戳的转换
pd.to_datetime(['2020.09.15','2020-09-15','2020/09/15','15/09/2020'])
Out[303]:
DatetimeIndex(['2020-09-15', '2020-09-15', '2020-09-15', '2020-09-15'], dtype='datetime64[ns]', freq=None)
In [304]:
import time
time.time() # 秒
Out[304]:
1640335089.056209
In [305]:
pd.to_datetime(1600171606,unit='s')
Out[305]:
Timestamp('2020-09-15 12:06:46')
In [306]:
dt = pd.to_datetime(1600171606469,unit='ms') # 世界标准时间
dt
Out[306]:
Timestamp('2020-09-15 12:06:46.469000')
In [307]:
dt + pd.DateOffset(hours = 8) # 北京时间
Out[307]:
Timestamp('2020-09-15 20:06:46.469000')
In [308]:
dt + pd.DateOffset(days = 100) # 100天之后日期
Out[308]:
Timestamp('2020-12-24 12:06:46.469000')

时间戳索引¶

In [309]:
ts = pd.Series(np.random.randint(0,300,size = 200),
               index=pd.date_range('2020-09-15',freq='D',periods=200))
ts
Out[309]:
2020-09-15    278
2020-09-16     65
2020-09-17    211
2020-09-18    268
2020-09-19     40
2020-09-20     38
2020-09-21    234
2020-09-22    132
2020-09-23    101
2020-09-24    237
2020-09-25    234
2020-09-26    176
2020-09-27     35
2020-09-28    198
2020-09-29     30
2020-09-30     50
2020-10-01     70
2020-10-02    140
2020-10-03    118
2020-10-04    234
2020-10-05    206
2020-10-06     40
2020-10-07     22
2020-10-08    224
2020-10-09    133
2020-10-10    135
2020-10-11     78
2020-10-12    211
2020-10-13     33
2020-10-14    290
             ... 
2021-03-04     84
2021-03-05    158
2021-03-06    193
2021-03-07    130
2021-03-08    275
2021-03-09    162
2021-03-10    160
2021-03-11     51
2021-03-12     48
2021-03-13     99
2021-03-14    129
2021-03-15     20
2021-03-16     52
2021-03-17     80
2021-03-18    112
2021-03-19     53
2021-03-20    240
2021-03-21     56
2021-03-22    164
2021-03-23    281
2021-03-24    154
2021-03-25    275
2021-03-26    298
2021-03-27     26
2021-03-28    157
2021-03-29    259
2021-03-30     38
2021-03-31    194
2021-04-01    294
2021-04-02    240
Freq: D, Length: 200, dtype: int64
In [310]:
# str字符串,进行索引
ts['2020/09/18']
Out[310]:
268
In [108]:
ts['2020/09/15':'2020.09.20'] # 切片操作
Out[108]:
2020-09-15     34
2020-09-16     68
2020-09-17     65
2020-09-18    187
2020-09-19    273
2020-09-20     35
Freq: D, dtype: int64
In [109]:
ts['2020/09'] # 获取了9月份的数据
Out[109]:
2020-09-15     34
2020-09-16     68
2020-09-17     65
2020-09-18    187
2020-09-19    273
2020-09-20     35
2020-09-21    232
2020-09-22    249
2020-09-23    256
2020-09-24    166
2020-09-25    217
2020-09-26    159
2020-09-27    285
2020-09-28     79
2020-09-29    214
2020-09-30    120
Freq: D, dtype: int64
In [110]:
ts['2021'] # 获取了2020年的数据
Out[110]:
2021-01-01    120
2021-01-02    154
2021-01-03     39
2021-01-04     69
2021-01-05      9
2021-01-06    107
2021-01-07     27
2021-01-08     48
2021-01-09    148
2021-01-10    120
2021-01-11    179
2021-01-12    284
2021-01-13    164
2021-01-14     14
2021-01-15    196
2021-01-16    278
2021-01-17    238
2021-01-18    267
2021-01-19    183
2021-01-20     88
2021-01-21     21
2021-01-22    106
2021-01-23    190
2021-01-24     10
2021-01-25     49
2021-01-26    163
2021-01-27     22
2021-01-28    184
2021-01-29     67
2021-01-30    264
             ... 
2021-03-04    239
2021-03-05    152
2021-03-06    155
2021-03-07     67
2021-03-08    281
2021-03-09    208
2021-03-10      0
2021-03-11     55
2021-03-12    248
2021-03-13    299
2021-03-14    181
2021-03-15     65
2021-03-16      7
2021-03-17      6
2021-03-18    158
2021-03-19     66
2021-03-20    156
2021-03-21     26
2021-03-22     25
2021-03-23    272
2021-03-24    224
2021-03-25     38
2021-03-26     37
2021-03-27    260
2021-03-28    191
2021-03-29     16
2021-03-30    189
2021-03-31    101
2021-04-01     37
2021-04-02    202
Freq: D, Length: 92, dtype: int64
In [311]:
ts[pd.Timestamp('2020.09.15')]
Out[311]:
278
In [312]:
ts[pd.Timestamp('2020.09.15'):pd.Timestamp('2020.09.22')]
Out[312]:
2020-09-15    278
2020-09-16     65
2020-09-17    211
2020-09-18    268
2020-09-19     40
2020-09-20     38
2020-09-21    234
2020-09-22    132
Freq: D, dtype: int64
In [313]:
pd.Period('2020.09.15',freq='2D')
Out[313]:
Period('2020-09-15', '2D')
In [314]:
ts[pd.Timestamp('2020.09.15')::3] # 有间隔的获取数据
Out[314]:
2020-09-15    278
2020-09-18    268
2020-09-21    234
2020-09-24    237
2020-09-27     35
2020-09-30     50
2020-10-03    118
2020-10-06     40
2020-10-09    133
2020-10-12    211
2020-10-15    273
2020-10-18     82
2020-10-21    206
2020-10-24    128
2020-10-27     39
2020-10-30    157
2020-11-02    228
2020-11-05    217
2020-11-08     51
2020-11-11    218
2020-11-14    261
2020-11-17    284
2020-11-20    222
2020-11-23    296
2020-11-26    108
2020-11-29    199
2020-12-02     31
2020-12-05     64
2020-12-08    126
2020-12-11    274
             ... 
2021-01-04     54
2021-01-07     42
2021-01-10     79
2021-01-13     95
2021-01-16    259
2021-01-19      4
2021-01-22    206
2021-01-25    139
2021-01-28    289
2021-01-31     28
2021-02-03    126
2021-02-06    222
2021-02-09    124
2021-02-12     38
2021-02-15    139
2021-02-18    276
2021-02-21     10
2021-02-24     79
2021-02-27    267
2021-03-02     65
2021-03-05    158
2021-03-08    275
2021-03-11     51
2021-03-14    129
2021-03-17     80
2021-03-20    240
2021-03-23    281
2021-03-26    298
2021-03-29    259
2021-04-01    294
Freq: 3D, Length: 67, dtype: int64
In [315]:
ts[pd.Period('2020.09.15',freq='2D')]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/usr/local/lib64/python3.6/site-packages/pandas/core/indexes/base.py in get_value(self, series, key)
   4380             try:
-> 4381                 return libindex.get_value_box(s, key)
   4382             except IndexError:

pandas/_libs/index.pyx in pandas._libs.index.get_value_box()

pandas/_libs/index.pyx in pandas._libs.index.get_value_at()

pandas/_libs/util.pxd in pandas._libs.util.get_value_at()

pandas/_libs/util.pxd in pandas._libs.util.validate_indexer()

TypeError: 'Period' object cannot be interpreted as an integer

During handling of the above exception, another exception occurred:

KeyError                                  Traceback (most recent call last)
/usr/local/lib64/python3.6/site-packages/pandas/core/indexes/datetimes.py in get_value(self, series, key)
    945         try:
--> 946             return com.maybe_box(self, Index.get_value(self, series, key),
    947                                  series, key)

/usr/local/lib64/python3.6/site-packages/pandas/core/indexes/base.py in get_value(self, series, key)
   4388                 else:
-> 4389                     raise e1
   4390             except Exception:  # pragma: no cover

/usr/local/lib64/python3.6/site-packages/pandas/core/indexes/base.py in get_value(self, series, key)
   4374             return self._engine.get_value(s, k,
-> 4375                                           tz=getattr(series.dtype, 'tz', None))
   4376         except KeyError as e1:

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_value()

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_value()

pandas/_libs/index.pyx in pandas._libs.index.DatetimeEngine.get_loc()

pandas/_libs/index.pyx in pandas._libs.index.DatetimeEngine._date_check_type()

KeyError: Period('2020-09-15', '2D')

During handling of the above exception, another exception occurred:

ValueError                                Traceback (most recent call last)
/usr/local/lib64/python3.6/site-packages/pandas/core/indexes/datetimes.py in get_value(self, series, key)
    955             try:
--> 956                 return self.get_value_maybe_box(series, key)
    957             except (TypeError, ValueError, KeyError):

/usr/local/lib64/python3.6/site-packages/pandas/core/indexes/datetimes.py in get_value_maybe_box(self, series, key)
    968         elif not isinstance(key, Timestamp):
--> 969             key = Timestamp(key)
    970         values = self._engine.get_value(com.values_from_object(series),

pandas/_libs/tslibs/timestamps.pyx in pandas._libs.tslibs.timestamps.Timestamp.__new__()

pandas/_libs/tslibs/conversion.pyx in pandas._libs.tslibs.conversion.convert_to_tsobject()

ValueError: Cannot convert Period to Timestamp unambiguously. Use to_timestamp

During handling of the above exception, another exception occurred:

KeyError                                  Traceback (most recent call last)
<ipython-input-315-0e1e667908db> in <module>
----> 1 ts[pd.Period('2020.09.15',freq='2D')]

/usr/local/lib64/python3.6/site-packages/pandas/core/series.py in __getitem__(self, key)
    866         key = com.apply_if_callable(key, self)
    867         try:
--> 868             result = self.index.get_value(self, key)
    869 
    870             if not is_scalar(result):

/usr/local/lib64/python3.6/site-packages/pandas/core/indexes/datetimes.py in get_value(self, series, key)
    956                 return self.get_value_maybe_box(series, key)
    957             except (TypeError, ValueError, KeyError):
--> 958                 raise KeyError(key)
    959 
    960     def get_value_maybe_box(self, series, key):

KeyError: Period('2020-09-15', '2D')
In [316]:
ts[pd.date_range('2020.09.15',freq='D',periods=15)]
Out[316]:
2020-09-15    278
2020-09-16     65
2020-09-17    211
2020-09-18    268
2020-09-19     40
2020-09-20     38
2020-09-21    234
2020-09-22    132
2020-09-23    101
2020-09-24    237
2020-09-25    234
2020-09-26    176
2020-09-27     35
2020-09-28    198
2020-09-29     30
Freq: D, dtype: int64
In [317]:
ts.index.year
Out[317]:
Int64Index([2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020,
            ...
            2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021],
           dtype='int64', length=200)
In [318]:
ts.index.dayofyear # 202001915 对应着2020年的第259天
Out[318]:
Int64Index([259, 260, 261, 262, 263, 264, 265, 266, 267, 268,
            ...
             83,  84,  85,  86,  87,  88,  89,  90,  91,  92],
           dtype='int64', length=200)
In [319]:
import warnings
warnings.filterwarnings('ignore')
In [320]:
ts.index.weekofyear # 对应着一年中第多少周
Out[320]:
Int64Index([38, 38, 38, 38, 38, 38, 39, 39, 39, 39,
            ...
            12, 12, 12, 12, 12, 13, 13, 13, 13, 13],
           dtype='int64', length=200)
In [321]:
ts.shift(periods = 2,freq = pd.tseries.offsets.Day()) # 天移动
Out[321]:
2020-09-17    278
2020-09-18     65
2020-09-19    211
2020-09-20    268
2020-09-21     40
2020-09-22     38
2020-09-23    234
2020-09-24    132
2020-09-25    101
2020-09-26    237
2020-09-27    234
2020-09-28    176
2020-09-29     35
2020-09-30    198
2020-10-01     30
2020-10-02     50
2020-10-03     70
2020-10-04    140
2020-10-05    118
2020-10-06    234
2020-10-07    206
2020-10-08     40
2020-10-09     22
2020-10-10    224
2020-10-11    133
2020-10-12    135
2020-10-13     78
2020-10-14    211
2020-10-15     33
2020-10-16    290
             ... 
2021-03-06     84
2021-03-07    158
2021-03-08    193
2021-03-09    130
2021-03-10    275
2021-03-11    162
2021-03-12    160
2021-03-13     51
2021-03-14     48
2021-03-15     99
2021-03-16    129
2021-03-17     20
2021-03-18     52
2021-03-19     80
2021-03-20    112
2021-03-21     53
2021-03-22    240
2021-03-23     56
2021-03-24    164
2021-03-25    281
2021-03-26    154
2021-03-27    275
2021-03-28    298
2021-03-29     26
2021-03-30    157
2021-03-31    259
2021-04-01     38
2021-04-02    194
2021-04-03    294
2021-04-04    240
Freq: D, Length: 200, dtype: int64
In [322]:
ts
Out[322]:
2020-09-15    278
2020-09-16     65
2020-09-17    211
2020-09-18    268
2020-09-19     40
2020-09-20     38
2020-09-21    234
2020-09-22    132
2020-09-23    101
2020-09-24    237
2020-09-25    234
2020-09-26    176
2020-09-27     35
2020-09-28    198
2020-09-29     30
2020-09-30     50
2020-10-01     70
2020-10-02    140
2020-10-03    118
2020-10-04    234
2020-10-05    206
2020-10-06     40
2020-10-07     22
2020-10-08    224
2020-10-09    133
2020-10-10    135
2020-10-11     78
2020-10-12    211
2020-10-13     33
2020-10-14    290
             ... 
2021-03-04     84
2021-03-05    158
2021-03-06    193
2021-03-07    130
2021-03-08    275
2021-03-09    162
2021-03-10    160
2021-03-11     51
2021-03-12     48
2021-03-13     99
2021-03-14    129
2021-03-15     20
2021-03-16     52
2021-03-17     80
2021-03-18    112
2021-03-19     53
2021-03-20    240
2021-03-21     56
2021-03-22    164
2021-03-23    281
2021-03-24    154
2021-03-25    275
2021-03-26    298
2021-03-27     26
2021-03-28    157
2021-03-29    259
2021-03-30     38
2021-03-31    194
2021-04-01    294
2021-04-02    240
Freq: D, Length: 200, dtype: int64

时间序列常用操作¶

In [323]:
ts = pd.Series(np.random.randint(0,1024,size = 365),
               index = pd.date_range('2020/1/1',freq='D',periods=365))
ts
Out[323]:
2020-01-01     294
2020-01-02      25
2020-01-03      57
2020-01-04     624
2020-01-05     703
2020-01-06     613
2020-01-07     473
2020-01-08     929
2020-01-09     766
2020-01-10     620
2020-01-11     298
2020-01-12     484
2020-01-13     731
2020-01-14      57
2020-01-15     869
2020-01-16     888
2020-01-17     614
2020-01-18     822
2020-01-19     289
2020-01-20     134
2020-01-21     898
2020-01-22     377
2020-01-23     616
2020-01-24     951
2020-01-25     968
2020-01-26      99
2020-01-27     416
2020-01-28     966
2020-01-29     512
2020-01-30     902
              ... 
2020-12-01     602
2020-12-02    1007
2020-12-03      77
2020-12-04     483
2020-12-05     824
2020-12-06     405
2020-12-07      22
2020-12-08      45
2020-12-09     233
2020-12-10     736
2020-12-11     866
2020-12-12     367
2020-12-13     375
2020-12-14     987
2020-12-15     270
2020-12-16     966
2020-12-17     130
2020-12-18     602
2020-12-19     145
2020-12-20     644
2020-12-21     253
2020-12-22     437
2020-12-23     219
2020-12-24     908
2020-12-25     438
2020-12-26     976
2020-12-27     490
2020-12-28     702
2020-12-29     614
2020-12-30     472
Freq: D, Length: 365, dtype: int64

数据移动¶

In [324]:
ts.shift(periods=2) # 数据向后移动2
Out[324]:
2020-01-01       NaN
2020-01-02       NaN
2020-01-03     294.0
2020-01-04      25.0
2020-01-05      57.0
2020-01-06     624.0
2020-01-07     703.0
2020-01-08     613.0
2020-01-09     473.0
2020-01-10     929.0
2020-01-11     766.0
2020-01-12     620.0
2020-01-13     298.0
2020-01-14     484.0
2020-01-15     731.0
2020-01-16      57.0
2020-01-17     869.0
2020-01-18     888.0
2020-01-19     614.0
2020-01-20     822.0
2020-01-21     289.0
2020-01-22     134.0
2020-01-23     898.0
2020-01-24     377.0
2020-01-25     616.0
2020-01-26     951.0
2020-01-27     968.0
2020-01-28      99.0
2020-01-29     416.0
2020-01-30     966.0
               ...  
2020-12-01     819.0
2020-12-02      66.0
2020-12-03     602.0
2020-12-04    1007.0
2020-12-05      77.0
2020-12-06     483.0
2020-12-07     824.0
2020-12-08     405.0
2020-12-09      22.0
2020-12-10      45.0
2020-12-11     233.0
2020-12-12     736.0
2020-12-13     866.0
2020-12-14     367.0
2020-12-15     375.0
2020-12-16     987.0
2020-12-17     270.0
2020-12-18     966.0
2020-12-19     130.0
2020-12-20     602.0
2020-12-21     145.0
2020-12-22     644.0
2020-12-23     253.0
2020-12-24     437.0
2020-12-25     219.0
2020-12-26     908.0
2020-12-27     438.0
2020-12-28     976.0
2020-12-29     490.0
2020-12-30     702.0
Freq: D, Length: 365, dtype: float64
In [325]:
ts.shift(periods=-2) # 数据向前移动
Out[325]:
2020-01-01     57.0
2020-01-02    624.0
2020-01-03    703.0
2020-01-04    613.0
2020-01-05    473.0
2020-01-06    929.0
2020-01-07    766.0
2020-01-08    620.0
2020-01-09    298.0
2020-01-10    484.0
2020-01-11    731.0
2020-01-12     57.0
2020-01-13    869.0
2020-01-14    888.0
2020-01-15    614.0
2020-01-16    822.0
2020-01-17    289.0
2020-01-18    134.0
2020-01-19    898.0
2020-01-20    377.0
2020-01-21    616.0
2020-01-22    951.0
2020-01-23    968.0
2020-01-24     99.0
2020-01-25    416.0
2020-01-26    966.0
2020-01-27    512.0
2020-01-28    902.0
2020-01-29     78.0
2020-01-30    833.0
              ...  
2020-12-01     77.0
2020-12-02    483.0
2020-12-03    824.0
2020-12-04    405.0
2020-12-05     22.0
2020-12-06     45.0
2020-12-07    233.0
2020-12-08    736.0
2020-12-09    866.0
2020-12-10    367.0
2020-12-11    375.0
2020-12-12    987.0
2020-12-13    270.0
2020-12-14    966.0
2020-12-15    130.0
2020-12-16    602.0
2020-12-17    145.0
2020-12-18    644.0
2020-12-19    253.0
2020-12-20    437.0
2020-12-21    219.0
2020-12-22    908.0
2020-12-23    438.0
2020-12-24    976.0
2020-12-25    490.0
2020-12-26    702.0
2020-12-27    614.0
2020-12-28    472.0
2020-12-29      NaN
2020-12-30      NaN
Freq: D, Length: 365, dtype: float64

日期移动¶

In [326]:
ts.shift(periods=5,freq=pd.tseries.offsets.Day()) # 时间后移;负数,前移
Out[326]:
2020-01-06     294
2020-01-07      25
2020-01-08      57
2020-01-09     624
2020-01-10     703
2020-01-11     613
2020-01-12     473
2020-01-13     929
2020-01-14     766
2020-01-15     620
2020-01-16     298
2020-01-17     484
2020-01-18     731
2020-01-19      57
2020-01-20     869
2020-01-21     888
2020-01-22     614
2020-01-23     822
2020-01-24     289
2020-01-25     134
2020-01-26     898
2020-01-27     377
2020-01-28     616
2020-01-29     951
2020-01-30     968
2020-01-31      99
2020-02-01     416
2020-02-02     966
2020-02-03     512
2020-02-04     902
              ... 
2020-12-06     602
2020-12-07    1007
2020-12-08      77
2020-12-09     483
2020-12-10     824
2020-12-11     405
2020-12-12      22
2020-12-13      45
2020-12-14     233
2020-12-15     736
2020-12-16     866
2020-12-17     367
2020-12-18     375
2020-12-19     987
2020-12-20     270
2020-12-21     966
2020-12-22     130
2020-12-23     602
2020-12-24     145
2020-12-25     644
2020-12-26     253
2020-12-27     437
2020-12-28     219
2020-12-29     908
2020-12-30     438
2020-12-31     976
2021-01-01     490
2021-01-02     702
2021-01-03     614
2021-01-04     472
Freq: D, Length: 365, dtype: int64
In [327]:
ts.shift(periods=-5,freq=pd.tseries.offsets.MonthBegin())
Out[327]:
2019-08-01     294
2019-09-01      25
2019-09-01      57
2019-09-01     624
2019-09-01     703
2019-09-01     613
2019-09-01     473
2019-09-01     929
2019-09-01     766
2019-09-01     620
2019-09-01     298
2019-09-01     484
2019-09-01     731
2019-09-01      57
2019-09-01     869
2019-09-01     888
2019-09-01     614
2019-09-01     822
2019-09-01     289
2019-09-01     134
2019-09-01     898
2019-09-01     377
2019-09-01     616
2019-09-01     951
2019-09-01     968
2019-09-01      99
2019-09-01     416
2019-09-01     966
2019-09-01     512
2019-09-01     902
              ... 
2020-07-01     602
2020-08-01    1007
2020-08-01      77
2020-08-01     483
2020-08-01     824
2020-08-01     405
2020-08-01      22
2020-08-01      45
2020-08-01     233
2020-08-01     736
2020-08-01     866
2020-08-01     367
2020-08-01     375
2020-08-01     987
2020-08-01     270
2020-08-01     966
2020-08-01     130
2020-08-01     602
2020-08-01     145
2020-08-01     644
2020-08-01     253
2020-08-01     437
2020-08-01     219
2020-08-01     908
2020-08-01     438
2020-08-01     976
2020-08-01     490
2020-08-01     702
2020-08-01     614
2020-08-01     472
Freq: D, Length: 365, dtype: int64

频率转换¶

In [328]:
ts.asfreq(pd.tseries.offsets.MonthEnd()) # 365天,频率转变成月
Out[328]:
2020-01-31     78
2020-02-29    956
2020-03-31    676
2020-04-30    511
2020-05-31    303
2020-06-30    259
2020-07-31     18
2020-08-31    704
2020-09-30    431
2020-10-31    948
2020-11-30     66
Freq: M, dtype: int64
In [329]:
ts.asfreq(pd.tseries.offsets.Week()) # 转变成周
Out[329]:
2020-01-01     294
2020-01-08     929
2020-01-15     869
2020-01-22     377
2020-01-29     512
2020-02-05     257
2020-02-12     923
2020-02-19     571
2020-02-26     834
2020-03-04     127
2020-03-11     709
2020-03-18      85
2020-03-25     537
2020-04-01     583
2020-04-08      24
2020-04-15    1004
2020-04-22     265
2020-04-29     234
2020-05-06     259
2020-05-13     330
2020-05-20     563
2020-05-27     918
2020-06-03     975
2020-06-10     720
2020-06-17     160
2020-06-24     490
2020-07-01     535
2020-07-08     603
2020-07-15      20
2020-07-22     585
2020-07-29     897
2020-08-05     669
2020-08-12     223
2020-08-19     954
2020-08-26     873
2020-09-02     605
2020-09-09     531
2020-09-16     903
2020-09-23     622
2020-09-30     431
2020-10-07     194
2020-10-14     222
2020-10-21     652
2020-10-28     848
2020-11-04     908
2020-11-11     946
2020-11-18     352
2020-11-25      65
2020-12-02    1007
2020-12-09     233
2020-12-16     966
2020-12-23     219
2020-12-30     472
Freq: W, dtype: int64
In [330]:
ts.asfreq(pd.tseries.offsets.Hour(),fill_value=0) # 时间频率转换从天变换为小时,空数据
Out[330]:
2020-01-01 00:00:00    294
2020-01-01 01:00:00      0
2020-01-01 02:00:00      0
2020-01-01 03:00:00      0
2020-01-01 04:00:00      0
2020-01-01 05:00:00      0
2020-01-01 06:00:00      0
2020-01-01 07:00:00      0
2020-01-01 08:00:00      0
2020-01-01 09:00:00      0
2020-01-01 10:00:00      0
2020-01-01 11:00:00      0
2020-01-01 12:00:00      0
2020-01-01 13:00:00      0
2020-01-01 14:00:00      0
2020-01-01 15:00:00      0
2020-01-01 16:00:00      0
2020-01-01 17:00:00      0
2020-01-01 18:00:00      0
2020-01-01 19:00:00      0
2020-01-01 20:00:00      0
2020-01-01 21:00:00      0
2020-01-01 22:00:00      0
2020-01-01 23:00:00      0
2020-01-02 00:00:00     25
2020-01-02 01:00:00      0
2020-01-02 02:00:00      0
2020-01-02 03:00:00      0
2020-01-02 04:00:00      0
2020-01-02 05:00:00      0
                      ... 
2020-12-28 19:00:00      0
2020-12-28 20:00:00      0
2020-12-28 21:00:00      0
2020-12-28 22:00:00      0
2020-12-28 23:00:00      0
2020-12-29 00:00:00    614
2020-12-29 01:00:00      0
2020-12-29 02:00:00      0
2020-12-29 03:00:00      0
2020-12-29 04:00:00      0
2020-12-29 05:00:00      0
2020-12-29 06:00:00      0
2020-12-29 07:00:00      0
2020-12-29 08:00:00      0
2020-12-29 09:00:00      0
2020-12-29 10:00:00      0
2020-12-29 11:00:00      0
2020-12-29 12:00:00      0
2020-12-29 13:00:00      0
2020-12-29 14:00:00      0
2020-12-29 15:00:00      0
2020-12-29 16:00:00      0
2020-12-29 17:00:00      0
2020-12-29 18:00:00      0
2020-12-29 19:00:00      0
2020-12-29 20:00:00      0
2020-12-29 21:00:00      0
2020-12-29 22:00:00      0
2020-12-29 23:00:00      0
2020-12-30 00:00:00    472
Freq: H, Length: 8737, dtype: int64
In [331]:
ts['2020/02/29']
Out[331]:
956

重采样¶

In [332]:
# 时间序列重采样和 之前分组聚合有一拼
ts.resample(rule = 'M').agg(np.sum)
Out[332]:
2020-01-31    17073
2020-02-29    17348
2020-03-31    14243
2020-04-30    15688
2020-05-31    16943
2020-06-30    15582
2020-07-31    14005
2020-08-31    16092
2020-09-30    17443
2020-10-31    17696
2020-11-30    16462
2020-12-31    15295
Freq: M, dtype: int64
In [333]:
ts.resample(rule = '3M').cumsum()
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-333-57b733967b56> in <module>
----> 1 ts.resample(rule = '3M').cumsum()

/usr/local/lib64/python3.6/site-packages/pandas/core/resample.py in __getattr__(self, attr)
     99             return self[attr]
    100 
--> 101         return object.__getattribute__(self, attr)
    102 
    103     def __iter__(self):

AttributeError: 'DatetimeIndexResampler' object has no attribute 'cumsum'
In [33]:
np.cum
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-33-87b9b312805d> in <module>
----> 1 np.cum

AttributeError: module 'numpy' has no attribute 'cum'
In [335]:
# 重采样,就是按季度进行计算
ts.resample(rule='3M').agg(np.sum).cumsum()
Out[335]:
2020-01-31     17073
2020-04-30     64352
2020-07-31    110882
2020-10-31    162113
2021-01-31    193870
Freq: 3M, dtype: int64

DataFrame重采样¶

In [336]:
df = pd.DataFrame(data = {'price':np.random.randint(0,100,size = 365),
                          'volume':np.random.randint(0,100,size = 365),
                          'time':pd.date_range('2020.09.15',periods=365)})
df
Out[336]:
price volume time
0 12 78 2020-09-15
1 55 44 2020-09-16
2 81 3 2020-09-17
3 20 5 2020-09-18
4 79 38 2020-09-19
5 38 42 2020-09-20
6 65 88 2020-09-21
7 28 98 2020-09-22
8 68 36 2020-09-23
9 20 63 2020-09-24
10 19 34 2020-09-25
11 95 31 2020-09-26
12 20 60 2020-09-27
13 62 35 2020-09-28
14 52 48 2020-09-29
15 59 60 2020-09-30
16 73 38 2020-10-01
17 64 12 2020-10-02
18 16 86 2020-10-03
19 35 96 2020-10-04
20 95 43 2020-10-05
21 3 41 2020-10-06
22 13 27 2020-10-07
23 22 94 2020-10-08
24 6 87 2020-10-09
25 49 62 2020-10-10
26 80 7 2020-10-11
27 15 47 2020-10-12
28 28 6 2020-10-13
29 99 69 2020-10-14
... ... ... ...
335 71 71 2021-08-16
336 23 95 2021-08-17
337 37 41 2021-08-18
338 12 93 2021-08-19
339 80 98 2021-08-20
340 1 20 2021-08-21
341 46 0 2021-08-22
342 14 63 2021-08-23
343 76 64 2021-08-24
344 33 14 2021-08-25
345 76 50 2021-08-26
346 95 89 2021-08-27
347 74 9 2021-08-28
348 66 0 2021-08-29
349 20 18 2021-08-30
350 48 75 2021-08-31
351 70 9 2021-09-01
352 89 71 2021-09-02
353 72 57 2021-09-03
354 54 72 2021-09-04
355 13 63 2021-09-05
356 83 61 2021-09-06
357 87 82 2021-09-07
358 74 37 2021-09-08
359 19 6 2021-09-09
360 4 67 2021-09-10
361 23 5 2021-09-11
362 51 59 2021-09-12
363 6 83 2021-09-13
364 67 37 2021-09-14

365 rows × 3 columns

In [337]:
df.resample(rule = 'M',on = 'time').sum()
Out[337]:
price volume
time
2020-09-30 773 763
2020-10-31 1545 1526
2020-11-30 1655 1674
2020-12-31 1396 1507
2021-01-31 1586 1361
2021-02-28 1440 1197
2021-03-31 1651 1473
2021-04-30 1363 1832
2021-05-31 1450 1678
2021-06-30 1504 1377
2021-07-31 1519 1310
2021-08-31 1637 1559
2021-09-30 712 709
In [338]:
df.resample(rule = 'M',on = 'time').apply(np.sum)
Out[338]:
price volume
time
2020-09-30 773 763
2020-10-31 1545 1526
2020-11-30 1655 1674
2020-12-31 1396 1507
2021-01-31 1586 1361
2021-02-28 1440 1197
2021-03-31 1651 1473
2021-04-30 1363 1832
2021-05-31 1450 1678
2021-06-30 1504 1377
2021-07-31 1519 1310
2021-08-31 1637 1559
2021-09-30 712 709
In [339]:
df.resample(rule = 'M',on = 'time').transform(np.sum)
Out[339]:
price volume
0 773 763
1 773 763
2 773 763
3 773 763
4 773 763
5 773 763
6 773 763
7 773 763
8 773 763
9 773 763
10 773 763
11 773 763
12 773 763
13 773 763
14 773 763
15 773 763
16 1545 1526
17 1545 1526
18 1545 1526
19 1545 1526
20 1545 1526
21 1545 1526
22 1545 1526
23 1545 1526
24 1545 1526
25 1545 1526
26 1545 1526
27 1545 1526
28 1545 1526
29 1545 1526
... ... ...
335 1637 1559
336 1637 1559
337 1637 1559
338 1637 1559
339 1637 1559
340 1637 1559
341 1637 1559
342 1637 1559
343 1637 1559
344 1637 1559
345 1637 1559
346 1637 1559
347 1637 1559
348 1637 1559
349 1637 1559
350 1637 1559
351 712 709
352 712 709
353 712 709
354 712 709
355 712 709
356 712 709
357 712 709
358 712 709
359 712 709
360 712 709
361 712 709
362 712 709
363 712 709
364 712 709

365 rows × 2 columns

数据可视化¶

线形图¶

In [3]:
df1 = pd.DataFrame(np.random.randn(1000,4),columns=list('ABCD'))
df1.cumsum().plot() # 表示绘制线
Out[3]:
<AxesSubplot:>
No description has been provided for this image

条形图、柱状图¶

In [4]:
df2 = pd.DataFrame(np.random.rand(10,4),columns=list('ABCD'))
df2.plot.bar(stacked = True) # 柱状图
df2.plot.barh()
Out[4]:
<AxesSubplot:>
No description has been provided for this image
No description has been provided for this image

饼图¶

In [5]:
df3 = pd.DataFrame(np.random.rand(4,2),columns=['one','two'],index = list('ABCD'))
df3['one'].plot.pie()
df3.plot.pie(subplots = True,figsize = (10,10),autopct = '%0.2f%%')
/usr/local/lib64/python3.6/site-packages/pandas/plotting/_tools.py:307: MatplotlibDeprecationWarning: 
The rowNum attribute was deprecated in Matplotlib 3.2 and will be removed two minor releases later. Use ax.get_subplotspec().rowspan.start instead.
  layout[ax.rowNum, ax.colNum] = ax.get_visible()
/usr/local/lib64/python3.6/site-packages/pandas/plotting/_tools.py:307: MatplotlibDeprecationWarning: 
The colNum attribute was deprecated in Matplotlib 3.2 and will be removed two minor releases later. Use ax.get_subplotspec().colspan.start instead.
  layout[ax.rowNum, ax.colNum] = ax.get_visible()
/usr/local/lib64/python3.6/site-packages/pandas/plotting/_tools.py:313: MatplotlibDeprecationWarning: 
The rowNum attribute was deprecated in Matplotlib 3.2 and will be removed two minor releases later. Use ax.get_subplotspec().rowspan.start instead.
  if not layout[ax.rowNum + 1, ax.colNum]:
/usr/local/lib64/python3.6/site-packages/pandas/plotting/_tools.py:313: MatplotlibDeprecationWarning: 
The colNum attribute was deprecated in Matplotlib 3.2 and will be removed two minor releases later. Use ax.get_subplotspec().colspan.start instead.
  if not layout[ax.rowNum + 1, ax.colNum]:
Out[5]:
array([<AxesSubplot:ylabel='one'>, <AxesSubplot:ylabel='two'>],
      dtype=object)
No description has been provided for this image
No description has been provided for this image

散点图¶

In [6]:
# 表示两个属性之间的关系
df4 = pd.DataFrame(np.random.randn(100,4),columns=list('ABCD'))
df4.plot.scatter(x = 'A',y = 'B')
Out[6]:
<AxesSubplot:xlabel='A', ylabel='B'>
No description has been provided for this image
In [7]:
# 一张图显示,A和C关系,同时显示B和D关系
# 返回值,视图
ax = df4.plot.scatter(x = 'A',y = 'C',color = 'DarkBlue',label = 'Group1')

# 再次向ax中绘制图形
df4.plot.scatter(x = 'B',y = 'D',color = 'DarkGreen',label = 'Group2',
                 alpha = 0.5,#透明度
                 s = np.random.randint(30,100,size = 100), # 大小各不相同
                 ax = ax) # 表示向子视图ax中继续进行绘制
Out[7]:
<AxesSubplot:xlabel='B', ylabel='D'>
No description has been provided for this image

面积图¶

In [8]:
df5 = pd.DataFrame(np.random.rand(10,4),columns=list('ABCD'))
df5.plot.area(stacked = True)
Out[8]:
<AxesSubplot:>
No description has been provided for this image

箱式图¶

In [9]:
# 特殊的条形图,表示数据分布情况
df6 = pd.DataFrame(np.random.randn(20,5),columns=list('ABCDE'))
df6.plot.box() # 绿色线表示中位数,上四分之一,下四分之一,表示异常值
Out[9]:
<AxesSubplot:>
No description has been provided for this image
In [10]:
df6.describe().round(2)
Out[10]:
A B C D E
count 20.00 20.00 20.00 20.00 20.00
mean -0.24 -0.07 0.11 -0.20 0.06
std 1.48 1.17 0.98 1.39 0.95
min -4.60 -2.33 -2.04 -2.88 -1.38
25% -0.64 -0.98 -0.55 -0.78 -0.53
50% 0.01 -0.38 0.18 -0.10 0.04
75% 0.46 1.12 0.61 0.40 0.47
max 2.14 2.16 1.63 2.82 2.17

直方图¶

In [11]:
# 表示概率,分布,一种形式的条形图
df7 =pd.DataFrame(data = {'A':np.random.randn(1000) - 2,
                          'B':np.random.randn(1000),
                          'C':np.random.randn(1000) + 2})
df7.plot.hist()
df7.plot.hist(stacked = False,alpha = 0.65) # 堆叠效果
Out[11]:
<AxesSubplot:ylabel='Frequency'>
No description has been provided for this image
No description has been provided for this image
In [12]:
# 子视图的直方图
df7.hist(figsize = (9,9)) # 3个属性各绘制了直方图
/usr/local/lib64/python3.6/site-packages/pandas/plotting/_tools.py:307: MatplotlibDeprecationWarning: 
The rowNum attribute was deprecated in Matplotlib 3.2 and will be removed two minor releases later. Use ax.get_subplotspec().rowspan.start instead.
  layout[ax.rowNum, ax.colNum] = ax.get_visible()
/usr/local/lib64/python3.6/site-packages/pandas/plotting/_tools.py:307: MatplotlibDeprecationWarning: 
The colNum attribute was deprecated in Matplotlib 3.2 and will be removed two minor releases later. Use ax.get_subplotspec().colspan.start instead.
  layout[ax.rowNum, ax.colNum] = ax.get_visible()
/usr/local/lib64/python3.6/site-packages/pandas/plotting/_tools.py:313: MatplotlibDeprecationWarning: 
The rowNum attribute was deprecated in Matplotlib 3.2 and will be removed two minor releases later. Use ax.get_subplotspec().rowspan.start instead.
  if not layout[ax.rowNum + 1, ax.colNum]:
/usr/local/lib64/python3.6/site-packages/pandas/plotting/_tools.py:313: MatplotlibDeprecationWarning: 
The colNum attribute was deprecated in Matplotlib 3.2 and will be removed two minor releases later. Use ax.get_subplotspec().colspan.start instead.
  if not layout[ax.rowNum + 1, ax.colNum]:
Out[12]:
array([[<AxesSubplot:title={'center':'A'}>,
        <AxesSubplot:title={'center':'B'}>],
       [<AxesSubplot:title={'center':'C'}>, <AxesSubplot:>]], dtype=object)
No description has been provided for this image

实战-拉勾网数据分析师招聘数据分析¶

加载、查看、去重¶

In [13]:
import numpy as np

import pandas as pd
In [14]:
job = pd.read_csv('./lagou2020.csv')
job.shape
Out[14]:
(3683, 12)
In [15]:
job.head()
Out[15]:
positionName companyShortName city companySize education financeStage industryField salary workYear hitags companyLabelList job_detail
0 高级数据分析师 拉勾网 北京 500-2000人 本科 D轮及以上 企业服务 25k-35k 5-10年 ["免费下午茶","ipo倒计时","bat背景","地铁周边","每天管两餐","定期团建... ["五险一金","弹性工作","带薪年假","免费两餐"] \n1.搭建数据指标框架,完整并准确反映业务趋势和变化,及时发现和定位问题\n2.独立完成数...
1 数据分析师 OK Group 北京 500-2000人 大专 B轮 金融 25k-45k 5-10年 NaN ["节日礼物","年度旅游","扁平管理","领导好"] \n工作职责:\n1. 负责建立交易平台日常分析体系,包括核心指标体系、报表体系,专题活动分...
2 高级数据分析师 金山办公软件 北京 2000人以上 本科 上市公司 移动互联网 15k-25k 3-5年 NaN ["年底双薪","节日礼物","技能培训","绩效奖金"] \n职位描述:1.对亿计的办公用户数据进行深度挖掘,引导产品、运营,并能实际应用到业务中带来...
3 数据分析师 金山办公软件 北京 2000人以上 本科 上市公司 移动互联网 15k-25k 1-3年 NaN ["年底双薪","节日礼物","技能培训","绩效奖金"] \n工作职责:-负责日常运营、业务数据等分析-针对产品需求做深入的数据分析报告,分析用户行为...
4 数据分析师 京东集团 北京 2000人以上 本科 上市公司 电商 15k-30k 3-5年 ["免费班车","免费体检","地铁周边"] ["五险一金","带薪年假","免费班车","定期体检"] \n【数据分析师岗】\n岗位要求:\n1、构建及维护客户体验相关数据报表平台;\n2、与大数...
In [16]:
job.city.unique()
Out[16]:
array(['北京', '上海', '深圳', '广州', '杭州', '成都', '南京', '武汉', '西安', '厦门', '长沙',
       '苏州', '天津'], dtype=object)
In [17]:
job.drop_duplicates(inplace=True)
In [18]:
job.shape
Out[18]:
(3507, 12)
In [19]:
job.reset_index(inplace=True) # 行索引重置:0~最后,从0开始编号
In [20]:
job
Out[20]:
index positionName companyShortName city companySize education financeStage industryField salary workYear hitags companyLabelList job_detail
0 0 高级数据分析师 拉勾网 北京 500-2000人 本科 D轮及以上 企业服务 25k-35k 5-10年 ["免费下午茶","ipo倒计时","bat背景","地铁周边","每天管两餐","定期团建... ["五险一金","弹性工作","带薪年假","免费两餐"] \n1.搭建数据指标框架,完整并准确反映业务趋势和变化,及时发现和定位问题\n2.独立完成数...
1 1 数据分析师 OK Group 北京 500-2000人 大专 B轮 金融 25k-45k 5-10年 NaN ["节日礼物","年度旅游","扁平管理","领导好"] \n工作职责:\n1. 负责建立交易平台日常分析体系,包括核心指标体系、报表体系,专题活动分...
2 2 高级数据分析师 金山办公软件 北京 2000人以上 本科 上市公司 移动互联网 15k-25k 3-5年 NaN ["年底双薪","节日礼物","技能培训","绩效奖金"] \n职位描述:1.对亿计的办公用户数据进行深度挖掘,引导产品、运营,并能实际应用到业务中带来...
3 3 数据分析师 金山办公软件 北京 2000人以上 本科 上市公司 移动互联网 15k-25k 1-3年 NaN ["年底双薪","节日礼物","技能培训","绩效奖金"] \n工作职责:-负责日常运营、业务数据等分析-针对产品需求做深入的数据分析报告,分析用户行为...
4 4 数据分析师 京东集团 北京 2000人以上 本科 上市公司 电商 15k-30k 3-5年 ["免费班车","免费体检","地铁周边"] ["五险一金","带薪年假","免费班车","定期体检"] \n【数据分析师岗】\n岗位要求:\n1、构建及维护客户体验相关数据报表平台;\n2、与大数...
5 5 数据分析师 鲸鱼外教培优 北京 500-2000人 本科 B轮 教育 15k-30k 3-5年 NaN ["交通补助","绩效奖金","带薪年假","节日礼物"] \n 1.负责业务数据分析工作,基于业务场景,建立核心业务数据模型及预警体系;...
6 6 数据分析 北银消费 北京 150-500人 本科 不需要融资 金融 15k-20k 1-3年 NaN ["节日礼物","技能培训","绩效奖金","岗位晋升"] \n 职责描述:\n1、对公司业务数据进行分析,提出有效合理的风控建议;\n2...
7 7 数据分析师 时趣social-touch 北京 500-2000人 本科 D轮及以上 移动互联网 15k-20k 3-5年 NaN ["弹性工作","年终奖金","个性福利","带薪年假"] \n 岗位描述:\n品牌舆情,社交分析,服务过品牌客户,发布周期性评估报告(美...
8 8 数据分析师 e城e家 北京 2000人以上 本科 不需要融资 移动互联网,消费生活 15k-25k 3-5年 NaN ["年底双薪","绩效奖金","带薪年假","午餐补助"] \n 技能要求:\n数据分析,SQL,数据挖掘,需求分析,商业数据分析,SPS...
9 9 数据分析专员 钛氪新媒体科技 北京 50-150人 本科 未融资 移动互联网 8k-16k 1-3年 NaN [] \n 职位职责:\n1、负责iNews新闻大数据产品数据分析,提出数据问题、分...
10 10 数据分析专家 伊澳科技 北京 2000人以上 本科 上市公司 移动互联网,电商 35k-55k 5-10年 NaN ["专项奖金","股票期权","绩效奖金","年终分红"] \n 职位描述\n1.基于对业务深入理解的基础上,搭建业务分析模型,为业务提供...
11 11 数据分析师 数数科技 北京 15-50人 本科 A轮 游戏,数据服务 10k-20k 1-3年 NaN ["节日礼物","股票期权","带薪年假","年终分红"] \n 职位描述:\n\n1. 负责数据后台的实施落地,引导客户了解产品使用方法...
12 12 数据分析师 省钱快报 北京 150-500人 本科 C轮 移动互联网,电商 20k-40k 3-5年 NaN ["技能培训","带薪年假","绩效奖金","股票期权"] \n 职位描述:\n1、负责搜索和推荐业务的数据分析工作;\n2、基于内外部的...
13 13 数据分析 省钱快报 北京 150-500人 本科 C轮 移动互联网,电商 20k-40k 3-5年 NaN ["技能培训","带薪年假","绩效奖金","股票期权"] \n 职位描述: \n1、负责搜索和推荐业务的数据分析工作 \n2、基于内外部...
14 14 数据分析师 蛋壳公寓 北京 2000人以上 本科 上市公司 消费生活 20k-25k 3-5年 ["试用期上公积金","地铁周边","6险1金"] ["技能培训","带薪年假","岗位晋升","年度旅游"] \n岗位职责:\n1、深入洞察行业、用户、业务背景,分析核心数据,制定科学目标;\n2、建立...
15 16 数据分析专员 钛氪新媒体科技 北京 50-150人 本科 未融资 移动互联网 8k-16k 1-3年 NaN [] \n\n\n\n职位职责:\n\n1、负责iNews新闻大数据产品的数据分析、挖掘、监控、整...
16 17 数据分析师 小帮规划 北京 500-2000人 本科 B轮 移动互联网,金融 25k-45k 3-5年 NaN ["五险一金","午餐补助","交通补助","带薪年假"] \n 这个职位需要做什么?\n1. 业务数据分析体系优化:包含但不限于业务数据...
17 18 数据分析师 美图公司 北京 2000人以上 本科 上市公司 硬件 25k-45k 3-5年 NaN ["节日礼物","与大牛共事","福利健全","五险一金"] \n 岗位职责: \n\n1、关注市场动态,做行业深度分析,定期产出行业以及竞...
18 21 数据分析师 魔力耳朵 北京 500-2000人 本科 B轮 教育 8k-15k 1-3年 NaN ["带薪年假","弹性工作","节日礼物","领导好"] \n 【岗位职责】\n1.基于对教学服务深入理解的基础上,搭建业务分析模型,统...
19 22 高级数据分析师 用友 北京 500-2000人 本科 上市公司 移动互联网,数据服务 18k-30k 3-5年 NaN [] \n数据分析师 岗位职责:1、 负责政府数据产品和项目中的数据治理、数据分析、数据展示工作;...
20 23 数据分析师 跟谁学 北京 2000人以上 本科 上市公司 移动互联网,教育 15k-25k 3-5年 NaN ["节日礼物","技能培训","股票期权","精英团队"] \n 岗位职责:\n1、 深度了解公司业务,通过业务数据表现发掘用户、运营、人...
21 24 数据分析 最右 北京 500-2000人 本科 D轮及以上 文娱丨内容 15k-30k 1-3年 NaN ["技能培训","连续创业团队","年度旅游","扁平管理"] \n职责:\n1.对最右产品运营数据进行分析、监测、统计,并形成指标体系;\n2.制定业务核...
22 25 数据分析实习生 琥珀创想 北京 50-150人 本科 A轮 移动互联网 4k-5k 应届毕业生 NaN ["绩效奖金","提供工作餐","定期团建","交通补助"] \n工作内容: \n1、负责竞品相关数据监控,定期更新数据,形成相关报表;\n2、负责对异常...
23 26 数据分析师(教育产品) 跟谁学 北京 2000人以上 本科 上市公司 移动互联网,教育 15k-30k 3-5年 NaN ["节日礼物","技能培训","股票期权","精英团队"] \n 岗位职责:\n1、 深度了解公司业务,通过业务数据表现发掘用户、运营、人...
24 27 数据分析师 ZMT众盟数据 北京 500-2000人 大专 C轮 移动互联网,数据服务 12k-15k 1-3年 NaN ["股票期权","专项奖金","绩效奖金","五险一金"] \n 岗位职责:\n 1、负责每日部门日常数据报表与分析指标;\n  2、负责...
25 29 高级数据分析师 探探 北京 150-500人 本科 D轮及以上 移动互联网,社交 25k-45k 3-5年 NaN ["股票期权","带薪年假","岗位晋升","扁平管理"] \n职位职责:\n1、整体负责探探下产品业务线的各项数据分析相关工作\n2、协助构建新的数据...
26 30 数据分析师 海捷科技 北京 50-150人 不限 不需要融资 移动互联网,数据服务 10k-20k 不限 NaN ["定期体检","带薪年假","年度旅游","节日礼物"] \n 岗位职责:\n1、根据业务需求,充分利用现有数据资源,进行数据提取、整理...
27 31 数据分析师 盛业恒泰投资 北京 50-150人 不限 未融资 金融 8k-15k 不限 NaN [] \n 一 、岗位职责\n1,搜集行业相关信息,为相关需求者提供更准确的数据信息...
28 32 数据分析师 易观 北京 150-500人 本科 B轮 移动互联网,数据服务 25k-50k 3-5年 ["早十晚七","生日聚会"] ["专项奖金","午餐补助","技能培训","扁平管理"] \n岗位职责:\n1.深入了解互联网业务,建立基于业务场景的数据分析需求,解决各类数据分析问...
29 33 高级数据分析师 易观 北京 150-500人 本科 B轮 移动互联网,数据服务 25k-50k 5-10年 ["早十晚七","生日聚会"] ["专项奖金","午餐补助","技能培训","扁平管理"] \n岗位职责:\n1.深入了解互联网业务,建立基于业务场景的数据分析需求,解决各类数据分析问...
... ... ... ... ... ... ... ... ... ... ... ... ... ...
3477 3653 运营总监(天津) 谷川联行 天津 150-500人 本科 不需要融资 软件开发,企业服务 12k-15k 3-5年 NaN ["年底双薪","技能培训","带薪年假","绩效奖金"] \n岗位职责:\n1.负责招商网络的运营,完成招商网络商业化变现目标;\n2.协调利用各类资...
3478 3654 产品经理 天津商软 天津 15-50人 本科 不需要融资 移动互联网,消费生活 5k-8k 1-3年 NaN [] \n 岗位职责:\n1、根据公司战略进行调研和数据分析,规划相关产品战略,长短...
3479 3655 新媒体运营实习生 一念传媒 天津 少于15人 大专 未融资 电商 4k-6k 不限 NaN [] \n职位描述1.熟悉互联网推广手段,完成公司自媒体等平台推广工作2.负责内容创作更新,粉丝互...
3480 3656 安全投诉客服 嘉成 天津 500-2000人 大专 不需要融资 企业服务 其他 5k-7k 不限 NaN [] \n岗位职责:1、负责受理客户涉及安全问题相关的投诉,按要求快速响应,并准确记录处理结果;2...
3481 3657 短视频运营 精通教育科技集团有限公司 天津 500-2000人 本科 D轮及以上 教育 5k-8k 1-3年 NaN [] \n 岗位职责:\n1、根据抖音平台特性与品牌账号特性,策划、拍摄、剪辑视频内...
3482 3658 算法工程师自然语言处理 中电云脑(天津)科技有限公司 天津 15-50人 硕士 不需要融资 医疗丨健康,人工智能 15k-25k 3-5年 NaN [] \n技能要求:深度学习,自然语言处理,知识图谱(图像算法需熟悉深度学习)\n岗位职责:\n1...
3483 3659 电商运营专员 有范商贸 天津 50-150人 大专 未融资 电商 4k-6k 1-3年 NaN [] \n 岗位职责:\n1、商品线管理(库存需求,销售策略),日常策略设置及管理、...
3484 3660 产品运营 向荟科技 天津 50-150人 本科 未融资 企业服务,教育 5k-7k 1-3年 NaN [] \n负责多个C端求职产品运营工作;\n1、通过访谈、数据分析等方式,深度挖掘服务端使用过程中...
3485 3661 销售经理 平安普惠 天津 2000人以上 大专 上市公司 金融 10k-15k 不限 NaN [] \n岗位职责:1:利用公司提供的产品,客户资源以及平台,开发并维护客户关系;2:坚持诚信理念...
3486 3662 商务专员 中创汇聚 天津 50-150人 大专 未融资 其他 3k-6k 1年以下 NaN [] \n岗位职责:此岗位是为以后中层管理做储备的,从基层锻炼,为以后做管理打下坚实基础。\n1、...
3487 3663 运营专员 吉安犬科技 天津 15-50人 大专 未融资 硬件,软件开发 4k-6k 1-3年 NaN [] \n1、负责公司平台日常运营,商家界面上架、更新、下架等管理;平台活动页面上传,监督管理\n...
3488 3664 薪酬绩效专员 创驰房地产 天津 150-500人 大专 未融资 房产家居 4k-6k 1-3年 NaN [] \n岗位职责:1.考勤管理与相关文件存档;2.主要负责公司绩效考核、薪酬核算的工作,制作薪酬...
3489 3665 视频营销运营 捷士通移动房屋 天津 50-150人 大专 未融资 企业服务 6k-10k 3-5年 NaN [] \n岗位描述:1、负责公司各短视频账号的整体运营,增强品牌影响力,提升账号的粉丝量及活跃度;...
3490 3666 电子商务运营师 天津滨海迅腾科技集团 天津 150-500人 本科 未融资 移动互联网,电商 4k-8k 1-3年 NaN [] \n一、任职条件  1、电子商务相关专业本科以上学历,2年以上工作经验  2、熟练掌握网店运...
3491 3667 销售顾问 赢海昊宇科技 天津 少于15人 不限 未融资 企业服务、硬件 8k-16k 1-3年 NaN [] \n岗位职责: \r\n1.挖掘开拓本地商户,为客户的资金管理提供优质的解决方案。 \r\n...
3492 3668 新媒体运营 鑫创元 天津 15-50人 大专 未融资 其他 5k-9k 1-3年 NaN [] \n岗位职责:\n\n1、 根据运营、营销策略和目标,制定并执行公司网络运营、营销方案和流程...
3493 3669 电商运营 碧格伦(天津) 天津 50-150人 不限 未融资 电商,医疗丨健康 6k-10k 1-3年 NaN ["绩效奖金","午餐补助","带薪年假","节日礼物"] \n1、对互联网、电子商务有深入的了解,有2年以上互联网产品运营经验,美妆类相关经验加分\n...
3494 3670 搜索运营实习生 字节跳动 天津 2000人以上 本科 C轮 文娱丨内容 1k-2k 应届毕业生 NaN ["扁平管理","弹性工作","大厨定制三餐","就近租房补贴"] \n 职位职责:\n1、负责搜索运营内容建设的数据整理、审核、标注,并产出汇总...
3495 3671 高级经纪人 天津链家地产 天津 2000人以上 本科 D轮及以上 其他 5k-10k 应届毕业生 NaN [] \n 职位诱惑:\n全国连锁企业 发展前景大\n职位描述:\n任职要求:\n1...
3496 3672 运营经理(天津) 谷川联行 天津 150-500人 大专 不需要融资 软件开发,企业服务 8k-15k 1-3年 NaN ["年底双薪","技能培训","带薪年假","绩效奖金"] \n岗位职责:\n1.统筹【招商网络】B端品牌新媒体运营、商业场景化运营;\n2.善于从热点...
3497 3673 电商审核城市经理 快手 天津 2000人以上 本科 D轮及以上 文娱丨内容 15k-30k 5-10年 NaN ["股票期权","弹性工作","定期体检","岗位晋升"] \n 1、分析了解互联网电商行业趋势,熟悉电商业务逻辑,针对敏感事件,能够提前...
3498 3674 数据中心项目负责人 字节跳动 天津 2000人以上 本科 C轮 文娱丨内容 6k-10k 不限 NaN ["扁平管理","弹性工作","大厨定制三餐","就近租房补贴"] \n 职位职责:\n1. 业务专家团队日常人员管理、例会文件准备、绩效核算等基...
3499 3675 内容质量中心管理岗 字节跳动 天津 2000人以上 本科 C轮 文娱丨内容 8k-16k 3-5年 NaN ["扁平管理","弹性工作","大厨定制三餐","就近租房补贴"] \n 职位职责:\n1、负责所在审核业务部门的管理工作;\n2、与产品、技术、...
3500 3676 资深模型优化专员 字节跳动 天津 2000人以上 本科 C轮 文娱丨内容 6k-10k 1-3年 NaN ["扁平管理","弹性工作","大厨定制三餐","就近租房补贴"] \n 职位职责:\n1. 根据业务风控要求以及平台社区氛围,制定切实可行的模型...
3501 3677 内容质量高级经理 字节跳动 天津 2000人以上 本科 C轮 文娱丨内容 20k-30k 不限 NaN ["扁平管理","弹性工作","大厨定制三餐","就近租房补贴"] \n 职位职责:\n1、负责字节跳动旗下产品图文类及小视频类内容的业务管理,对...
3502 3678 内容运营高级经理-审核方向 字节跳动 天津 2000人以上 本科 C轮 文娱丨内容 20k-30k 不限 NaN ["扁平管理","弹性工作","大厨定制三餐","就近租房补贴"] \n 职位职责:\n1、负责字节跳动旗下产品图文类及小视频类内容的业务管理,对...
3503 3679 质检岗位基层管理岗 字节跳动 天津 2000人以上 本科 C轮 文娱丨内容 6k-10k 3-5年 NaN ["扁平管理","弹性工作","大厨定制三餐","就近租房补贴"] \n 职位职责:\n1、负责对日常业务数据进行分析、挖掘潜在隐患风险、提出风险...
3504 3680 高级审核编辑 字节跳动 天津 2000人以上 本科 C轮 文娱丨内容 8k-12k 3-5年 NaN ["扁平管理","弹性工作","大厨定制三餐","就近租房补贴"] \n 职位职责:\n1、根据审核标准,对自媒体发布的国内热点、新闻、优质内容做...
3505 3681 数据运营分析专员 字节跳动 天津 2000人以上 本科 C轮 文娱丨内容 6k-8k 3-5年 NaN ["扁平管理","弹性工作","大厨定制三餐","就近租房补贴"] \n 职位职责:\n1、协助数据分析团队项目的测试及开展,了解公司各部门的组织...
3506 3682 数据运营分析实习生 字节跳动 天津 2000人以上 本科 C轮 文娱丨内容 2k-3k 不限 NaN ["扁平管理","弹性工作","大厨定制三餐","就近租房补贴"] \n 职位职责:\n1、协助数据分析团队项目的测试及开展,了解公司各部门的组织...

3507 rows × 13 columns

过滤非数据分析岗位¶

In [21]:
# contains这个是字符串中方法,进行逻辑判断,是否含有
cond = job['positionName'].str.contains('数据分析')
cond
Out[21]:
0        True
1        True
2        True
3        True
4        True
5        True
6        True
7        True
8        True
9        True
10       True
11       True
12       True
13       True
14       True
15       True
16       True
17       True
18       True
19       True
20       True
21       True
22       True
23       True
24       True
25       True
26       True
27       True
28       True
29       True
        ...  
3477    False
3478    False
3479    False
3480    False
3481    False
3482    False
3483    False
3484    False
3485    False
3486    False
3487    False
3488    False
3489    False
3490    False
3491    False
3492    False
3493    False
3494    False
3495    False
3496    False
3497    False
3498    False
3499    False
3500    False
3501    False
3502    False
3503    False
3504    False
3505    False
3506    False
Name: positionName, Length: 3507, dtype: bool
In [22]:
job = job[cond]
job.shape
Out[22]:
(1652, 13)
In [23]:
job.reset_index(inplace=True) # 重置行索引
In [24]:
job
Out[24]:
level_0 index positionName companyShortName city companySize education financeStage industryField salary workYear hitags companyLabelList job_detail
0 0 0 高级数据分析师 拉勾网 北京 500-2000人 本科 D轮及以上 企业服务 25k-35k 5-10年 ["免费下午茶","ipo倒计时","bat背景","地铁周边","每天管两餐","定期团建... ["五险一金","弹性工作","带薪年假","免费两餐"] \n1.搭建数据指标框架,完整并准确反映业务趋势和变化,及时发现和定位问题\n2.独立完成数...
1 1 1 数据分析师 OK Group 北京 500-2000人 大专 B轮 金融 25k-45k 5-10年 NaN ["节日礼物","年度旅游","扁平管理","领导好"] \n工作职责:\n1. 负责建立交易平台日常分析体系,包括核心指标体系、报表体系,专题活动分...
2 2 2 高级数据分析师 金山办公软件 北京 2000人以上 本科 上市公司 移动互联网 15k-25k 3-5年 NaN ["年底双薪","节日礼物","技能培训","绩效奖金"] \n职位描述:1.对亿计的办公用户数据进行深度挖掘,引导产品、运营,并能实际应用到业务中带来...
3 3 3 数据分析师 金山办公软件 北京 2000人以上 本科 上市公司 移动互联网 15k-25k 1-3年 NaN ["年底双薪","节日礼物","技能培训","绩效奖金"] \n工作职责:-负责日常运营、业务数据等分析-针对产品需求做深入的数据分析报告,分析用户行为...
4 4 4 数据分析师 京东集团 北京 2000人以上 本科 上市公司 电商 15k-30k 3-5年 ["免费班车","免费体检","地铁周边"] ["五险一金","带薪年假","免费班车","定期体检"] \n【数据分析师岗】\n岗位要求:\n1、构建及维护客户体验相关数据报表平台;\n2、与大数...
5 5 5 数据分析师 鲸鱼外教培优 北京 500-2000人 本科 B轮 教育 15k-30k 3-5年 NaN ["交通补助","绩效奖金","带薪年假","节日礼物"] \n 1.负责业务数据分析工作,基于业务场景,建立核心业务数据模型及预警体系;...
6 6 6 数据分析 北银消费 北京 150-500人 本科 不需要融资 金融 15k-20k 1-3年 NaN ["节日礼物","技能培训","绩效奖金","岗位晋升"] \n 职责描述:\n1、对公司业务数据进行分析,提出有效合理的风控建议;\n2...
7 7 7 数据分析师 时趣social-touch 北京 500-2000人 本科 D轮及以上 移动互联网 15k-20k 3-5年 NaN ["弹性工作","年终奖金","个性福利","带薪年假"] \n 岗位描述:\n品牌舆情,社交分析,服务过品牌客户,发布周期性评估报告(美...
8 8 8 数据分析师 e城e家 北京 2000人以上 本科 不需要融资 移动互联网,消费生活 15k-25k 3-5年 NaN ["年底双薪","绩效奖金","带薪年假","午餐补助"] \n 技能要求:\n数据分析,SQL,数据挖掘,需求分析,商业数据分析,SPS...
9 9 9 数据分析专员 钛氪新媒体科技 北京 50-150人 本科 未融资 移动互联网 8k-16k 1-3年 NaN [] \n 职位职责:\n1、负责iNews新闻大数据产品数据分析,提出数据问题、分...
10 10 10 数据分析专家 伊澳科技 北京 2000人以上 本科 上市公司 移动互联网,电商 35k-55k 5-10年 NaN ["专项奖金","股票期权","绩效奖金","年终分红"] \n 职位描述\n1.基于对业务深入理解的基础上,搭建业务分析模型,为业务提供...
11 11 11 数据分析师 数数科技 北京 15-50人 本科 A轮 游戏,数据服务 10k-20k 1-3年 NaN ["节日礼物","股票期权","带薪年假","年终分红"] \n 职位描述:\n\n1. 负责数据后台的实施落地,引导客户了解产品使用方法...
12 12 12 数据分析师 省钱快报 北京 150-500人 本科 C轮 移动互联网,电商 20k-40k 3-5年 NaN ["技能培训","带薪年假","绩效奖金","股票期权"] \n 职位描述:\n1、负责搜索和推荐业务的数据分析工作;\n2、基于内外部的...
13 13 13 数据分析 省钱快报 北京 150-500人 本科 C轮 移动互联网,电商 20k-40k 3-5年 NaN ["技能培训","带薪年假","绩效奖金","股票期权"] \n 职位描述: \n1、负责搜索和推荐业务的数据分析工作 \n2、基于内外部...
14 14 14 数据分析师 蛋壳公寓 北京 2000人以上 本科 上市公司 消费生活 20k-25k 3-5年 ["试用期上公积金","地铁周边","6险1金"] ["技能培训","带薪年假","岗位晋升","年度旅游"] \n岗位职责:\n1、深入洞察行业、用户、业务背景,分析核心数据,制定科学目标;\n2、建立...
15 15 16 数据分析专员 钛氪新媒体科技 北京 50-150人 本科 未融资 移动互联网 8k-16k 1-3年 NaN [] \n\n\n\n职位职责:\n\n1、负责iNews新闻大数据产品的数据分析、挖掘、监控、整...
16 16 17 数据分析师 小帮规划 北京 500-2000人 本科 B轮 移动互联网,金融 25k-45k 3-5年 NaN ["五险一金","午餐补助","交通补助","带薪年假"] \n 这个职位需要做什么?\n1. 业务数据分析体系优化:包含但不限于业务数据...
17 17 18 数据分析师 美图公司 北京 2000人以上 本科 上市公司 硬件 25k-45k 3-5年 NaN ["节日礼物","与大牛共事","福利健全","五险一金"] \n 岗位职责: \n\n1、关注市场动态,做行业深度分析,定期产出行业以及竞...
18 18 21 数据分析师 魔力耳朵 北京 500-2000人 本科 B轮 教育 8k-15k 1-3年 NaN ["带薪年假","弹性工作","节日礼物","领导好"] \n 【岗位职责】\n1.基于对教学服务深入理解的基础上,搭建业务分析模型,统...
19 19 22 高级数据分析师 用友 北京 500-2000人 本科 上市公司 移动互联网,数据服务 18k-30k 3-5年 NaN [] \n数据分析师 岗位职责:1、 负责政府数据产品和项目中的数据治理、数据分析、数据展示工作;...
20 20 23 数据分析师 跟谁学 北京 2000人以上 本科 上市公司 移动互联网,教育 15k-25k 3-5年 NaN ["节日礼物","技能培训","股票期权","精英团队"] \n 岗位职责:\n1、 深度了解公司业务,通过业务数据表现发掘用户、运营、人...
21 21 24 数据分析 最右 北京 500-2000人 本科 D轮及以上 文娱丨内容 15k-30k 1-3年 NaN ["技能培训","连续创业团队","年度旅游","扁平管理"] \n职责:\n1.对最右产品运营数据进行分析、监测、统计,并形成指标体系;\n2.制定业务核...
22 22 25 数据分析实习生 琥珀创想 北京 50-150人 本科 A轮 移动互联网 4k-5k 应届毕业生 NaN ["绩效奖金","提供工作餐","定期团建","交通补助"] \n工作内容: \n1、负责竞品相关数据监控,定期更新数据,形成相关报表;\n2、负责对异常...
23 23 26 数据分析师(教育产品) 跟谁学 北京 2000人以上 本科 上市公司 移动互联网,教育 15k-30k 3-5年 NaN ["节日礼物","技能培训","股票期权","精英团队"] \n 岗位职责:\n1、 深度了解公司业务,通过业务数据表现发掘用户、运营、人...
24 24 27 数据分析师 ZMT众盟数据 北京 500-2000人 大专 C轮 移动互联网,数据服务 12k-15k 1-3年 NaN ["股票期权","专项奖金","绩效奖金","五险一金"] \n 岗位职责:\n 1、负责每日部门日常数据报表与分析指标;\n  2、负责...
25 25 29 高级数据分析师 探探 北京 150-500人 本科 D轮及以上 移动互联网,社交 25k-45k 3-5年 NaN ["股票期权","带薪年假","岗位晋升","扁平管理"] \n职位职责:\n1、整体负责探探下产品业务线的各项数据分析相关工作\n2、协助构建新的数据...
26 26 30 数据分析师 海捷科技 北京 50-150人 不限 不需要融资 移动互联网,数据服务 10k-20k 不限 NaN ["定期体检","带薪年假","年度旅游","节日礼物"] \n 岗位职责:\n1、根据业务需求,充分利用现有数据资源,进行数据提取、整理...
27 27 31 数据分析师 盛业恒泰投资 北京 50-150人 不限 未融资 金融 8k-15k 不限 NaN [] \n 一 、岗位职责\n1,搜集行业相关信息,为相关需求者提供更准确的数据信息...
28 28 32 数据分析师 易观 北京 150-500人 本科 B轮 移动互联网,数据服务 25k-50k 3-5年 ["早十晚七","生日聚会"] ["专项奖金","午餐补助","技能培训","扁平管理"] \n岗位职责:\n1.深入了解互联网业务,建立基于业务场景的数据分析需求,解决各类数据分析问...
29 29 33 高级数据分析师 易观 北京 150-500人 本科 B轮 移动互联网,数据服务 25k-50k 5-10年 ["早十晚七","生日聚会"] ["专项奖金","午餐补助","技能培训","扁平管理"] \n岗位职责:\n1.深入了解互联网业务,建立基于业务场景的数据分析需求,解决各类数据分析问...
... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
1622 2884 3055 数据分析师(食宿+五险) 潭州教育 长沙 2000人以上 大专 B轮 教育 3k-6k 1-3年 NaN [] \n 岗位职责:\n1.负责部门推广运营及多渠道业务数据的整理和分析,制作数据...
1623 2885 3056 数据分析实习生(J10694) 树根互联技术有限公司 长沙 150-500人 不限 A轮 移动互联网,企业服务 3k-5k 应届毕业生 NaN ["专项奖金","帅哥多","领导好","美女多"] \n 工作职责:\n(1)协助项业务需求和文档梳理工作;\n(2)协助算法工程...
1624 2886 3057 数据分析师 数魔 长沙 50-150人 本科 天使轮 电商,数据服务 12k-18k 3-5年 NaN ["年底双薪","带薪年假","年度旅游","领导好"] \n 位职责:\n1、完成因项目需要而开展的数据处理、整合,参与算法模型的开发...
1625 2887 3058 数据分析主管 益丰大药房 长沙 2000人以上 大专 上市公司 电商,医疗丨健康 6k-9k 3-5年 NaN ["年底双薪","绩效奖金","五险一金","免费午餐"] \n 岗位职责:\n1、提取商品销售等数据,进行数据分析,制作数据报表及数据可...
1626 2888 3059 数据分析 南京汇龙 长沙 150-500人 本科 未融资 移动互联网 5k-7k 1-3年 NaN [] \n数据岗位要求:(工作地点:长沙 )\n工作要求\n1、电信移动用户维系相关数据统计及分析...
1627 2889 3060 数据分析师 233网校 长沙 150-500人 本科 天使轮 移动互联网,教育 8k-10k 3-5年 NaN ["节日礼物","年底双薪","技能培训","岗位晋升"] \n岗位职责: 1、优化运营数据分析体系,帮助确定各项运营数据指标; 2、配合业务部门给予数...
1628 2890 3061 数据分析 北京天意飞扬科技 长沙 少于15人 不限 未融资 电商,移动互联网 8k-12k 1-3年 NaN [] \n1、能熟练使用SQL分析数据,熟练使用数理统计、数据分析、数据挖掘工具软件(SAS、R、...
1629 2891 3062 数据分析 蜜獾律师事务所 长沙 50-150人 本科 未融资 其他 8k-13k 3-5年 NaN [] \n岗位职责: 1.负责业务相关数据的获取、清洗、分析、挖掘和可视化,从数据收集/准备到模型...
1630 2892 3063 数据分析师 蜜獾信息 长沙 150-500人 本科 不需要融资 移动互联网 4k-8k 1-3年 NaN ["年底双薪","技能培训","绩效奖金","年度旅游"] \n岗位职责:\n1. 熟悉公司产品,对公司产品相关的业务数据进行分析、整理,产出基于数据的...
1631 2893 3064 bi数据分析师 武汉盛博汇 长沙 150-500人 大专 不需要融资 医疗丨健康,移动互联网 7k-10k 1-3年 NaN [] \n 岗位职责:\n1、正确理解业务,完成数据仓库主题设计,核心表设计,各类源...
1632 2894 3065 数据分析师中级(SC0902) 蜜獾信息 长沙 150-500人 本科 不需要融资 移动互联网 6k-10k 1-3年 NaN ["年底双薪","技能培训","绩效奖金","年度旅游"] \n工作职责:1.与中国及美国总部的IT部门,和业务部门紧密协作,搜集专业的房产及交易市场信...
1633 2895 3066 大数据分析师 政法频道 长沙 150-500人 硕士 不需要融资 其他 15k-30k 5-10年 NaN [] \n岗位职责:\n负责新闻资讯、用户行为数据等海量数据采集、处理、存储,应用方案的技术选型及...
1634 3164 3339 数据分析工程师 中地行 苏州 50-150人 本科 不需要融资 数据服务,移动互联网 8k-15k 1-3年 ["免费下午茶","免费体检","5险1金","地铁周边"] ["带薪年假","定期体检","专项奖金","年底双薪"] \n岗位描述:1、负责银行数据分析模型的建立、调优和迭代;2、负责银行数据的清洗加工;3、负...
1635 3165 3340 数据分析工程师 神彩科技 苏州 150-500人 本科 不需要融资 数据服务 8k-12k 1-3年 NaN ["带薪年假","管吃","领导好","全额五险一金"] \n岗位要求:\n本科及以上学历,计算机、数学、统计学;\n1.具有丰富的SQL经验;\n2...
1636 3166 3341 数据分析师 同程旅行 苏州 2000人以上 本科 上市公司 旅游 15k-30k 3-5年 NaN ["绩效奖金","股票期权","年底双薪","五险一金"] \n工作职责:\n1、本地生活业务数据分析,订单、营收、用户分级、留存、运营等策略方向分析;...
1637 3167 3342 高级数据分析师 K2DATA 苏州 150-500人 本科 B轮 数据服务 15k-30k 3-5年 NaN ["风口行业","顶尖团队","扁平管理","学习型组织"] \n岗位说明:\n1. 针对重点工业行业(能源,石化,汽车,钢铁、轮胎等)的智能制造与工业互...
1638 3168 3343 数据分析助理 美能华智能科技 苏州 15-50人 大专 A轮 企业服务,人工智能 4k-6k 不限 NaN [] \n 岗位职责:\n1、负责数据的整理和分析、为人工智能模型提供文字的标注数据...
1639 3169 3344 数据分析工程师(银行) 中地行 苏州 50-150人 本科 不需要融资 数据服务,移动互联网 12k-24k 不限 ["免费下午茶","免费体检","5险1金","地铁周边"] ["带薪年假","定期体检","专项奖金","年底双薪"] \n 岗位职责:\n1、负责银行数据分析模型的建立、调优和迭代;\n2、负责银...
1640 3170 3345 数据分析岗 昆山农商银行 苏州 500-2000人 本科 未融资 金融 12k-24k 1-3年 NaN ["专项奖金","午餐补助","节日礼物","技能培训"] \n 工作职责:\n1、根据业务进行数据集市与主维度模型的设计与建设,规范数据...
1641 3171 3346 数据分析师 苏州瑞鹏信息技术有限公司 苏州 50-150人 硕士 不需要融资 移动互联网,数据服务 12k-24k 1-3年 NaN [] \n 1、日常数据监控,包括日报设计、开发、维护等,完善数据报表体系,及时准确...
1642 3172 3347 数据分析师 同程艺龙 苏州 2000人以上 本科 上市公司 移动互联网,旅游 5k-6k 应届毕业生 NaN ["最佳雇主","爱旅游","免息贷款","年底双薪"] \n数据分析实习生职位要求:1)计算机、统计学、数学等相关专业,要求实习时间不短于6个月2)...
1643 3173 3348 专利数据分析师 智慧芽 苏州 150-500人 本科 D轮及以上 移动互联网 15k-25k 不限 NaN ["技能培训","年底双薪","节日礼物","绩效奖金"] \n 工作职责: \n1. 深度分析专利文本,定出专利文本加工(抽取,分析) ...
1644 3174 3349 游戏数据分析师 友谊时光 苏州 500-2000人 本科 上市公司 移动互联网,游戏 8k-15k 1-3年 NaN ["技能培训","年底双薪","节日礼物","绩效奖金"] \n 岗位职责:\n1、协助产品监控和跟踪游戏数据,出具敏捷报告;\n2、对游...
1645 3175 3350 数据分析师 准雀Accunique 苏州 2000人以上 硕士 未融资 数据服务,其他 10k-20k 不限 NaN ["年终分红","绩效奖金","专项奖金","带薪年假"] \n客户需求:科研数据分析、程序设计、疑难专业问题解答等需求(包括但不限于经济、金融、心理、...
1646 3176 3351 数据分析师 瑞小云 苏州 15-50人 本科 不需要融资 移动互联网 12k-18k 3-5年 NaN ["绩效奖金","专项奖金","股票期权","年度旅游"] \n职位描述1.用户运营数据分析支撑,通过用户特征、行为数据、产品转化数据等对业务进行挖掘和...
1647 3177 3352 数据分析师 华泛信息 苏州 2000人以上 大专 不需要融资 移动互联网,其他 10k-15k 1-3年 NaN ["技能培训","节日礼物","带薪年假","绩效奖金"] \n岗位职责:\n深入了解项目组的业务需求,在此基础上进行数据收集、数据分析、商业报告的撰写...
1648 3178 3353 大数据分析师 德融嘉信 苏州 50-150人 本科 不需要融资 移动互联网 6k-12k 1-3年 NaN [] \n岗位职责:\n1. 开展业务专题分析,使用数据挖掘各类算法构建相关的业务模型,完成业务分...
1649 3404 3580 ETL/大数据/数据分析/实施 格蒂电力 天津 500-2000人 大专 未融资 企业服务 6k-12k 3-5年 NaN ["技能培训","带薪年假","绩效奖金","岗位晋升"] \n工作职责\n1.   负责数据接入、数据整合中的链路配置与调度配置工作。\n职位要求\n...
1650 3405 3581 数据分析师 吉城美家 天津 2000人以上 本科 未融资 移动互联网 7k-14k 1-3年 NaN ["五险一金","岗位晋升"] \n负责站点日常数据分析、提前通过数据分析对业务有预测性、通过数据说话、解决站点管理问题、\n
1651 3406 3582 数据分析支持 云链供应链 天津 15-50人 本科 未融资 金融,企业服务 4k-6k 1-3年 NaN [] \n 岗位职责:\n1、负责部门日常数据报表的制定、维护、优化;\n2、支持运...

1652 rows × 14 columns

薪水¶

In [25]:
# applymap和map类似的,map操作Series,applymap操作的DataFrame
job['salary'] = job['salary'].str.lower().str.extract(r'(\d+)[k]-(\d+)[k]')\
             .applymap(lambda x : int(x)).mean(axis = 1)
/usr/local/lib/python3.6/site-packages/ipykernel_launcher.py:3: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  This is separate from the ipykernel package so we can avoid doing imports until

技能要求¶

Python
SQL
Tableau
Excel
SPSS/SAS

In [26]:
job['job_detail'] = job['job_detail'].str.lower() # 变成小写
/usr/local/lib/python3.6/site-packages/ipykernel_launcher.py:1: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  """Entry point for launching an IPython kernel.
In [27]:
job['Python'] = job['job_detail'].map(lambda x :1 if 'python' in x else 0)
job['SQL'] = job['job_detail'].map(lambda x : 1 if 'sql' in x else 0)
job['Tableau'] = job['job_detail'].map(lambda x :1 if 'tableau' in x else 0)
job['Excel'] = job['job_detail'].map(lambda x :1 if 'excel' in x else 0)
job['SPSS/SAS'] = job['job_detail'].map(lambda x :1 if ('spss' in x) or ('sas' in x) else 0)
/usr/local/lib/python3.6/site-packages/ipykernel_launcher.py:1: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  """Entry point for launching an IPython kernel.
/usr/local/lib/python3.6/site-packages/ipykernel_launcher.py:2: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  
/usr/local/lib/python3.6/site-packages/ipykernel_launcher.py:3: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  This is separate from the ipykernel package so we can avoid doing imports until
/usr/local/lib/python3.6/site-packages/ipykernel_launcher.py:4: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  after removing the cwd from sys.path.
/usr/local/lib/python3.6/site-packages/ipykernel_launcher.py:5: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  """
In [28]:
job.head()
Out[28]:
level_0 index positionName companyShortName city companySize education financeStage industryField salary workYear hitags companyLabelList job_detail Python SQL Tableau Excel SPSS/SAS
0 0 0 高级数据分析师 拉勾网 北京 500-2000人 本科 D轮及以上 企业服务 30.0 5-10年 ["免费下午茶","ipo倒计时","bat背景","地铁周边","每天管两餐","定期团建... ["五险一金","弹性工作","带薪年假","免费两餐"] \n1.搭建数据指标框架,完整并准确反映业务趋势和变化,及时发现和定位问题\n2.独立完成数... 1 1 0 0 0
1 1 1 数据分析师 OK Group 北京 500-2000人 大专 B轮 金融 35.0 5-10年 NaN ["节日礼物","年度旅游","扁平管理","领导好"] \n工作职责:\n1. 负责建立交易平台日常分析体系,包括核心指标体系、报表体系,专题活动分... 0 1 0 0 0
2 2 2 高级数据分析师 金山办公软件 北京 2000人以上 本科 上市公司 移动互联网 20.0 3-5年 NaN ["年底双薪","节日礼物","技能培训","绩效奖金"] \n职位描述:1.对亿计的办公用户数据进行深度挖掘,引导产品、运营,并能实际应用到业务中带来... 1 1 0 0 0
3 3 3 数据分析师 金山办公软件 北京 2000人以上 本科 上市公司 移动互联网 20.0 1-3年 NaN ["年底双薪","节日礼物","技能培训","绩效奖金"] \n工作职责:-负责日常运营、业务数据等分析-针对产品需求做深入的数据分析报告,分析用户行为... 0 1 0 0 1
4 4 4 数据分析师 京东集团 北京 2000人以上 本科 上市公司 电商 22.5 3-5年 ["免费班车","免费体检","地铁周边"] ["五险一金","带薪年假","免费班车","定期体检"] \n【数据分析师岗】\n岗位要求:\n1、构建及维护客户体验相关数据报表平台;\n2、与大数... 0 1 1 1 1

行业信息¶

In [29]:
job['industryField'][:30]
Out[29]:
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      移动互联网,社交
26    移动互联网,数据服务
27            金融
28    移动互联网,数据服务
29    移动互联网,数据服务
Name: industryField, dtype: object
In [31]:
def convert(x):
    field = x.split(',')
    if (field[0] == '移动互联网') & (len(field) > 1):
        return field[1]
    else:
        return field[0]
job['industryField'] = job.industryField.map(convert)
/usr/local/lib/python3.6/site-packages/ipykernel_launcher.py:7: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  import sys
In [32]:
job.industryField[:30]
Out[32]:
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       社交
26     数据服务
27       金融
28     数据服务
29     数据服务
Name: industryField, dtype: object
In [ ]: