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:>
条形图、柱状图¶
In [4]:
df2 = pd.DataFrame(np.random.rand(10,4),columns=list('ABCD'))
df2.plot.bar(stacked = True) # 柱状图
df2.plot.barh()
Out[4]:
<AxesSubplot:>
饼图¶
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)
散点图¶
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'>
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'>
面积图¶
In [8]:
df5 = pd.DataFrame(np.random.rand(10,4),columns=list('ABCD'))
df5.plot.area(stacked = True)
Out[8]:
<AxesSubplot:>
箱式图¶
In [9]:
# 特殊的条形图,表示数据分布情况
df6 = pd.DataFrame(np.random.randn(20,5),columns=list('ABCDE'))
df6.plot.box() # 绿色线表示中位数,上四分之一,下四分之一,表示异常值
Out[9]:
<AxesSubplot:>
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'>
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)
实战-拉勾网数据分析师招聘数据分析¶
加载、查看、去重¶
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 [ ]: